Наследяването ви позволява да използвате повторно код и да създавате по-чисти модели на данни. Но Django предлага повече от един начин за наследяване, така че се уверете, че знаете разликите.

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

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

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

Django предлага поддръжка за три типа наследяване на модели:

  1. Абстрактни базови класове.
  2. Наследяване на множество таблици.
  3. Прокси модели.

Всеки от тези типове наследяване на модели има предимства и ще ги използвате за конкретни цели.

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

Абстрактните базови класове осигуряват начин за дефиниране на общи полета и методи, които множество модели могат да наследяват. Например, ако имате два модела, споделящи подобни полета, можете да използвате абстрактен базов клас, за да дефинирате подобните полета. Разгледайте този пример:

instagram viewer

класКлиент(модели. Модел):
име = модели. CharField (max_length=50)
имейл = модели. EmailField()
customer_id = модели. IntegerField()

класПродавач(модели. Модел):
име = модели. CharField (max_length=50)
имейл = модели. EmailField()
seller_id = модели. IntegerField()

Кодовият фрагмент по-горе дефинира два модела Django: Клиент и Продавач. Тези модели споделят две общи полета, а именно име и електронна поща. За да предотвратите това излишък, можете да създадете отделен модел, който да съдържа общите полета в Клиент и Продавач модели и го направете абстрактен.

класПотребителска информация(модели. Модел):
име = модели. CharField (max_length=50)
имейл = модели. EmailField()

класМета:
абстрактно = Вярно

Горният кодов фрагмент дефинира нов модел и задава абстрактно атрибут към Вярно. Това означава, че моделът ще бъде абстрактен и Django няма да създаде таблица в базата данни.

Можете да пренапишете Клиент и Продавач модели като този:

класКлиент(Потребителска информация):
customer_id = модели. IntegerField()

класПродавач(Потребителска информация):
seller_id = модели. IntegerField()

В кодовия фрагмент по-горе, Клиент и Продавачи моделите наследяват от Потребителска информация модел вместо модели. Модел.

Можете да видите вашите модели в админ панела, като ги регистрирате във вашия admin.py файл като този:

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

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

Мигрирайте вашите режими и стартирайте вашия сървър за разработка, като изпълните следното на a командна линия:

python manage.py makemigrations \
&& python manage.py мигриране \
&& python manage.py runserver

Отидете до вашия администраторски сайт и влезте с вашите данни за суперпотребител. Трябва да видите и трите полета за всеки модел.

В този пример Django е създал таблица за Клиент и Продавач модели. Можете да видите, че Потребителска информация моделът няма таблица, тъй като е абстрактен.

Наследяване на множество таблици

Можете да използвате наследяване на множество таблици, когато родителският модел също трябва да съществува като таблица в базата данни заедно с дъщерния модел.

За разлика от абстрактното наследяване на базов клас, където родителският модел няма да бъде таблица в базата данни, наследяването с множество таблици създава таблица за родителския модел.

При наследяване с множество таблици дъщерният модел наследява всички полета и методи от своя родителски модел и добавя свои специфични полета. Външни ключове помощ за установяване на моделна връзка между родителски и детски модели.

Ето пример за наследяване на множество таблици:

класЛице(модели. Модел):
first_name = модели. CharField (max_length=100)
фамилия = модели. CharField (max_length=100)

дефget_name(себе си):
връщанее"{self.first_name}{self.last_name}"

класМета:
абстрактно = Вярно

класслужител(лице):
employee_id = модели. CharField (max_length=20)
отдел = модели. CharField (max_length=100)
заплата = модели. FloatField()
dob = модели. DateField()

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

Този кодов фрагмент дефинира три модела. Първият модел, т.нар Лице, е абстрактно. Той определя само собственото и фамилното име на човек.

Вторият модел, т.нар служител, наследява полетата на Лице но дефинира допълнителни полета. The служител моделът не е абстрактен, така че ще има своята таблица в базата данни.

Крайният модел, т.нар Управител, наследява полетата на служител модел и добавя поле, наречено заглавие.

Връзката между служител и Управител модели се нарича Наследяване на множество таблици. Мигрирайте вашите модели, регистрирайте ги admin.py, стартирайте вашия сървър и отидете до административния панел. Трябва да видите две таблици, създадени от Django.

Когато се опитате да добавите нов мениджър, ще забележите, че той има всички полета от служител модел, както и собствено потребителско поле.

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

Прокси моделът ви помага да създадете нов модел, който се разширява от съществуващ модел, без да създавате нова таблица на база данни. При този вид наследяване на модел, прокси и оригиналните модели ще споделят една и съща таблица. С помощта на прокси модели можете да правите неща като създаване на потребителски модели и промяна на мениджърите по подразбиране.

Можете да създадете прокси модел чрез добавяне прокси=Вярно в Мета клас. Ето един пример:

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

класМета:
прокси = Вярно

Типичното използване на прокси модел е подходящо, когато съществува базов модел и е необходимо да се създаде негова специализирана версия с добавена функционалност. Ето един основен пример:

класПубликувай(модели. Модел):
заглавие = модели. CharField (max_length=30)
автор = модели. CharField (max_length=30)

деф__str__(себе си):
връщане самозаглавие

класProxyPost(Публикация):

класМета:
прокси = Вярно

Този кодов фрагмент дефинира два модела: Публикувай и MyPost. The Публикувай моделът дефинира две полета за заглавие и автор. The ProxyPost модел наследява от Публикувай модел.

Мигрирайте горните модели и добавете нова публикация към таблицата, създадена за Публикувай модел.

След като добавите публикацията, отворете Прокси постове маса. Трябва да намерите публикацията, която сте добавили към Публикувай маса в него.

Промените, които правите в публикации в Прокси постове таблица ще засегне съответната публикация в Публикувай маса и обратно. Това доказва, че те наистина споделят една и съща маса.

Можете да промените ул() метод на прокси модела:

класProxyPost(Публикация):

класМета:
прокси = Вярно
поръчка = ["заглавие"]

деф__str__(себе си):
връщане себе си.автор

С тази модификация, a ProxyPost's представянето на низ ще бъде неговият автор, а не заглавието. Подреждането на прокси модела също ще бъде по заглавието вместо полето за ИД по подразбиране.

Когато използвате прокси модели, трябва да имате предвид, че не можете да добавяте потребителски полета към вашия прокси модел. Основният случай на използване на прокси модели е, когато искате един модел да поддържа множество поведения.

Прокси моделите ви помагат да промените поведението на съществуващ модел, без да модифицирате неговите полета или основната структура на таблицата на базата данни.

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

Като използвате различните техники за наследяване на модела, можете лесно да създадете многократно използваем и организиран код за вашия проект.

Наследяването на модела избягва излишния код и подобрява поддръжката и скалируемостта на вашия код. Освен това улеснява навигацията във вашия код, като по този начин насърчава ефективното сътрудничество между екипите за разработка.

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