В реальных проектах у нас может быть несколько моделей Django, и некоторые из этих моделей могут иметь общие поля, поэтому вместо создания всех общих полей в каждой модели Django мы можем создать абстрактную модель Django вместе со всеми этими общими полями и наследовать всю модель Django из абстрактного базового класса.
Давайте разберемся с базовым классом на примере:
class Employee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
age = models.SmallIntegerField(null=True)
created = models.DateTimeField(default=timezone.now)
work_experience = models.SmallIntegerField(default=0)
contact = models.OneToOneField(Contact, on_delete=models.CASCADE, null=True)
department = models.ForeignKey(Department, on_delete=models.CASCADE, default=None)
compensations = models.ManyToManyField(Compensation)
def __str__(self):
return f'{self.first_name} {self.last_name}'
class Trainee(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
age = models.SmallIntegerField(null=True)
created = models.DateTimeField(default=timezone.now)
contact = models.OneToOneField(Contact, on_delete=models.CASCADE, null=True)
department = models.ForeignKey(Department, on_delete=models.CASCADE, default=4)
def __str__(self):
return f'{self.first_name} {self.last_name}'
Как вы можете видеть в обеих приведенных выше таблицах ( Employee и Trainee), некоторые поля совпадают, а именно: first_name, last_name, age, created, contact. Предположим, вы работаете над реальным проектом и существует более сотни таблиц, тогда будет очень утомительно снова и снова определять одни и те же поля во всех моделях Django. Так что это лучший способ определить один абстрактный базовый класс Django и определить все общие поля внутри, а также наследовать все модели от абстрактного базового класса.
Как создать абстрактную модель в Django?
Как мы можем обсудить в приведенном выше определении абстрактного базового класса, процесс создания абстрактной модели в Django. Во-первых, вам нужно определить модель, которая будет производной от класса Model , который определен внутри класса пакета django.db.models, и определить все общие поля, которые вы хотите внутри этого, а после этого определить все нормальные модели Django, которые будут получены из абстрактного базового класса.
class Person(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
age = models.SmallIntegerField(null=True)
created = models.DateTimeField(default=timezone.now)
contact = models.OneToOneField(Contact, on_delete=models.CASCADE, null=True)
class Meta:
abstract = True
class Employee(Person):
work_experience = models.SmallIntegerField(default=0)
department = models.ForeignKey(Department, on_delete=models.CASCADE, default=None)
compensations = models.ManyToManyField(Compensation)
def __str__(self):
return f'{self.first_name} {self.last_name}'
class Trainee(Person):
department = models.ForeignKey(Department, on_delete=models.CASCADE, default=4)
def __str__(self):
return f'{self.first_name} {self.last_name}'
В данном случае мы создали абстрактную модель Person, в которую мы добавили общие поля из моделей Employee и Trainee.
Зарегистрируем в admin.py наши модели:
from django.contrib import admin
from .models import Employee, Trainee
admin.site.register(Employee)
admin.site.register(Trainee)
После применения команды makemigrations и migrate вы можете увидеть свои таблицы в панели администратора Django.
После того, как вы нажмете на ссылку Add , чтобы добавить сотрудника или стажера, вы увидите, что будут добавлены их общие поля. Принимая во внимание, что мы не добавляли эти поля в каждую модель отдельно, так что в этом сила абстрактной модели Django.
Также мы видим, что у наших стажеров автоматически подставился нужный департамент, так как мы его переопределили в нашей модели, добавив дефолтное значение, равное отделу с ID = 4
Итак, в этом разделе мы рассмотрели все о том, как использовать абстрактную модель в Django с помощью данного примера. Его также называют абстрактным классом Django. Абстрактная модель — одна из самых популярных и полезных функций Django. Она позволяет хранить идентичную или общую информацию для ряда моделей Django.
Вы всегда должны использовать абстрактную модель, если у вас много моделей Django, и они имеют общие поля, потому что это сэкономит вам много усилий и времени.