Рубрики
Без рубрики

Использование абстрактных моделей в Джангу

Один из принципов Python – «Не повторять себя». Абстрактные модели в Django предназначены для … с меткой Django, Python.

Один из принципов Python – «Не повторять себя». Абстрактные модели в Джангу должны сделать именно это.

Если вы проектируете базу данных для школы, были бы модели базы данных, представляющие все типы людей, которые посещают эту школу, которая включает студентов, учителей, уборщику персонала, кафетерии, школьные автобусы и т. Д.

Однако все эти люди имеют некоторую общую информацию, такую как название, дата рождения, дата присоединения, адреса и контактной информации и т. Д.

Это не кажется правильным повторением всех этих полей для каждой модели базы данных во время записи кода, и именно здесь абстрактные модели работают отлично.

Как создать абстрактную базовую модель?

Все, что вам нужно сделать, это создать базовую модель со всеми общими полями и установить в мета-классе.

Это гарантирует, что для этой базовой модели нет фактической таблицы базы данных, и она предназначена только для наследования других моделей, которые фактически становятся таблицами в базе данных.

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=255)
    date_of_birth = models.DateTimeField()
    date_of_joining = models.DateTimeField()
    address = models.TextField()

    class Meta:
        abstract = True

class Student(Person):
    roll_number = models.IntegerField()


class Teacher(Person):
    compensation = models.CharField(max_length=255)

После запуска миграции появится студенческий стол и таблица учителя, созданные в вашей базе данных, в то время как модель человека остается в вашей кодовой базе, готовой к унаследованной в другой модели, если вы решили.

Аннотация как можно больше

Принцип «не повторяю себя» не должен заканчиваться здесь. Например, даже если люди, принадлежащие к чистящему персоналу и кафетерии, также являются лицами, они оба имеют с момента смещения, которые студенты и преподаватели не делают.

from django.db import models

#======= Abstract models =========#
class Person(models.Model):
    name = models.CharField(max_length=255)
    date_of_birth = models.DateTimeField()
    date_of_joining = models.DateTimeField()
    address = models.TextField()

    class Meta:
        abstract = True

class SchoolEmployee(Person):
    compensation = models.CharField(max_length=255)

    class Meta:
        abstract = True

class HiredHelp(SchoolEmployee):
    shift_timings = models.JSONField()

    class Meta:
        abstract = True
#--------------------------------#

#======= Actual models ==========#
class Student(Person):
    roll_number = models.IntegerField()

class Teacher(SchoolEmployee):
    qualifications = models.JSONField()

class CafeteriaEmployee(HiredHelp):
    pass

class CleaningStaffMember(HiredHelp):
    pass
#--------------------------------#

В зависимости от вашего требования вы можете иметь дальнейшие абстрактные модели, которые наследуют от других абстрактных моделей.

Закрытие заметок

Важно помнить, что абстрактные модели сами по себе довольно бесполезны. Для них нет таблицы базы данных, и, следовательно, они не имеют никакого следствия.

Абстрактные модели полезны только в том случае, если вы намерены создавать другие модели, которые наследуют от абстрактных.

Абстрактные классы – это хороший пример того, как концепция наследования может использоваться для записи кода многоразового использования.

Первоначально опубликовано в моем блоге

Оригинал: “https://dev.to/sankalpjonna/using-abstract-models-in-django-1igi”