Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

2.11 Абстрактные модели
2 из 2 шагов пройдено

В реальных проектах у нас может быть несколько моделей 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, и они имеют общие поля, потому что это сэкономит вам много усилий и времени.


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

такое чувство что вы этот курс закинули просто (((

тут нет импорта timezone так же не указано надо это менять или это уже не важно в целом ничего не понятно 

Как создать абстрактную модель в 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}'