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

Наследование моделей — это функция Django ORM, которая позволяет разработчикам создавать иерархические отношения между моделями баз данных. Он обеспечивает повторное использование кода, расширяемость и более чистую кодовую базу за счет использования принципов объектно-ориентированного программирования.

Независимо от того, создаете ли вы сложное веб-приложение или работаете над небольшим проектом, наследование моделей может предложить значительные преимущества, такие как снижение избыточности и обеспечение согласованного поведения.

Типы наследования моделей в Django

Django предлагает поддержку трех типов наследования моделей:

  1. Абстрактные базовые классы.
  2. Многотабличное наследование.
  3. Прокси-модели.

Каждый из этих типов наследования моделей имеет свои преимущества, и вы будете использовать их для определенных целей.

instagram viewer

Абстрактные базовые классы

Абстрактные базовые классы позволяют определять общие поля и методы, которые могут наследовать несколько моделей. Например, если у вас есть две модели с одинаковыми полями, вы можете использовать абстрактный базовый класс для определения похожих полей. Взгляните на этот пример:

сортКлиент(модели. Модель):
имя = модели. CharField (max_length=50)
электронная почта = модели. EmailField()
идентификатор_клиента = модели. ЦелоеПоле()

сортПродавец(модели. Модель):
имя = модели. CharField (max_length=50)
электронная почта = модели. EmailField()
продавец_id = модели. ЦелоеПоле()

Фрагмент кода выше определяет две модели Django: Клиент и Продавец. Эти модели имеют два общих поля, а именно имя и электронная почта. Чтобы предотвратить эту избыточность, вы можете создать отдельную модель для хранения общих полей в Клиент и Продавец модели и сделать его абстрактным.

сортИнформация о пользователе(модели. Модель):
имя = модели. CharField (max_length=50)
электронная почта = модели. EmailField()

сортМета:
абстракция = Истинный

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

Вы можете переписать Клиент и Продавец такие модели:

сортКлиент(информация о пользователе):
идентификатор_клиента = модели. ЦелоеПоле()

сортПродавец(информация о пользователе):
продавец_id = модели. ЦелоеПоле()

В приведенном выше фрагменте кода Клиент и Продавцы модели наследуются от Информация о пользователе модель вместо модели. Модель.

Вы можете просматривать свои модели в админке, зарегистрировав их в личном кабинете. admin.py такой файл:

от .модели Импортировать Клиент, Продавец

admin.site.register (Клиент)
admin.site.register (Продавец)

Перенесите свои режимы и запустите сервер разработки, выполнив следующее на командная строка:

python manage.py makemigrations \
&& python manage.py миграция \
&& сервер запуска python manage.py

Перейдите на сайт администратора и войдите в систему, используя данные суперпользователя. Вы должны увидеть все три поля для каждой модели.

В этом примере Django создал таблицу для Клиент и Продавец модели. Вы можете видеть, что Информация о пользователе модель не имеет таблицы, так как она абстрактна.

Наследование нескольких таблиц

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

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

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

Вот пример многотабличного наследования:

сортЧеловек(модели. Модель):
имя_имя = модели. CharField (max_length=100)
фамилия = модели. CharField (max_length=100)

дефget_name(себя):
возвращатьсяф"{self.first_name}{я.фамилия}"

сортМета:
абстракция = Истинный

сортСотрудник(Человек):
идентификатор_сотрудника = модели. CharField (max_length=20)
отдел = модели. CharField (max_length=100)
зарплата = модели. Плавающее поле ()
доб = модели. ДатаПоле()

сортМенеджер(Сотрудник):
название = модели. CharField (max_length=100)

Этот фрагмент кода определяет три модели. Первая модель, названная Человек, является абстрактным. Он определяет только имя и фамилию человека.

Вторая модель, названная Сотрудник, наследует поля Человек но определяет дополнительные поля. Сотрудник модель не абстрактна, поэтому у нее будет своя таблица в базе данных.

Окончательная модель, названная Менеджер, наследует поля Сотрудник модель и добавляет поле с именем заголовок.

Отношения между Сотрудник и Менеджер модели называется Наследование нескольких таблиц. Перенесите свои модели, зарегистрируйте их в admin.py, запустите свой сервер и перейдите в панель администратора. Вы должны увидеть две таблицы, созданные Django.

Когда вы попытаетесь добавить нового менеджера, вы заметите, что у него есть все поля из Сотрудник модель, а также собственное настраиваемое поле.

Прокси-модели

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

Вы можете создать прокси-модель, добавив прокси=Истина в Мета сорт. Вот пример:

сортПроксиМодель(Базовая модель):

сортМета:
прокси = Истинный

Типичное использование прокси-модели уместно, когда существует базовая модель и необходимо создать ее специализированную версию с дополнительными функциями. Вот простой пример:

сортПочта(модели. Модель):
название = модели. CharField (max_length=30)
автор = модели. CharField (max_length=30)

деф__str__(себя):
возвращаться собственное название

сортПроксиПост(Почта):

сортМета:
прокси = Истинный

Этот фрагмент кода определяет две модели: Почта и Мой пост. Почта модель определяет два поля для названия и автора. ПроксиПост модель наследует от Почта модель.

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

После добавления сообщения откройте Прокси посты стол. Вы должны найти сообщение, которое вы добавили в Почта стол в нем.

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

Вы можете изменить ул() метод прокси-модели:

сортПроксиПост(Почта):

сортМета:
прокси = Истинный
заказ = ["заголовок"]

деф__str__(себя):
возвращаться автор

С этой модификацией ProxyPost строковым представлением будет его автор, а не заголовок. Заказ прокси-модели также будет осуществляться по заголовку, а не по полю идентификатора по умолчанию.

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

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

Используйте наследование модели для повторного использования кода и организационной структуры

Используя различные методы наследования моделей, вы можете легко создавать повторно используемый и организованный код для своего проекта.

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

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