Наследование позволяет повторно использовать код и создавать более чистые модели данных. Но Django предлагает более одного способа наследования, поэтому убедитесь, что вы знаете различия.
Наследование моделей — это функция Django ORM, которая позволяет разработчикам создавать иерархические отношения между моделями баз данных. Он обеспечивает повторное использование кода, расширяемость и более чистую кодовую базу за счет использования принципов объектно-ориентированного программирования.
Независимо от того, создаете ли вы сложное веб-приложение или работаете над небольшим проектом, наследование моделей может предложить значительные преимущества, такие как снижение избыточности и обеспечение согласованного поведения.
Типы наследования моделей в Django
Django предлагает поддержку трех типов наследования моделей:
- Абстрактные базовые классы.
- Многотабличное наследование.
- Прокси-модели.
Каждый из этих типов наследования моделей имеет свои преимущества, и вы будете использовать их для определенных целей.
Абстрактные базовые классы
Абстрактные базовые классы позволяют определять общие поля и методы, которые могут наследовать несколько моделей. Например, если у вас есть две модели с одинаковыми полями, вы можете использовать абстрактный базовый класс для определения похожих полей. Взгляните на этот пример:
сортКлиент(модели. Модель):
имя = модели. 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 предлагает наследование шаблонов, что является отличным способом управления и организации шаблонов для ваших проектов.