Как справиться с избыточным наследованием Django моделей - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь понять, как я могу справиться со следующим наследованием в моделях Django.

class Address(models.Model):
     street = models.CharField()
     city = models.CharField()
     country = models.CharField()

     class Meta:
         abstract = True

class Person(Address, models.Model):
     name = models.CharField()

class Caffe(Address, models.Model):
     place_name = models.CharField()
     owner_name = models.CharField()
     signature_drink = models.CharField()

Я знаю, что могу просто наследовать после Address, и это все равно будет работать. Но это выглядит некорректно - это делает код и наследование неясными (при условии, что каждая модель находится в другом файле). Кроме того, на мой взгляд, избыточность наследовать дважды от одного и того же класса (на разных уровнях, но все же). А может это единственный способ и он приемлем по стандартам Django?

Ответы [ 2 ]

1 голос
/ 14 июля 2020

FYI: есть пакеты , которые предоставляют вам поля, которые обрабатывают адреса.

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

  • Используйте инкапсулированную модель адреса посредством AddressField, чтобы ограничить количество миграций. Это AddressField является подклассом ForeignKey и обладает некоторыми дополнительными функциями, обеспечивающими правильное хранение информации. Изменения в адресной модели - это только изменения в адресной модели. Все адреса находятся в одном месте.
  • Используйте многотабличное наследование, когда имеет смысл, что адреса сами по себе являются объектами. The Place and Restaurant - хороший тому пример. Кроме того, вы можете найти место, выполнив поиск только для этого места, а затем посмотреть, ресторан это или, например, mov ie театр.
  • Используйте абстрактные модели, если вы не хотите, чтобы информация обменивалась между моделями . Каждый раз, когда вы меняете абстрактную модель, вы создаете миграции для всех моделей, которые ее используют. Это может стать серьезным бременем.

Вот некоторая дополнительная информация, о которой нужно знать: https://github.com/kdeldycke/awesome-falsehood#postal -адреса

0 голосов
/ 14 июля 2020

Вам не нужно наследовать Person и Caffe от models.Model, поскольку вы наследуете Person и Caffe от Address, а Address уже наследует от models.Model. Структура вашей модели будет иметь вид

class Address(models.Model):
     street = models.CharField()
     city = models.CharField()
     country = models.CharField()

     class Meta:
         abstract = True

class Person(Address):
     name = models.CharField()

class Caffe(Address):
     place_name = models.CharField()
     owner_name = models.CharField()
     signature_drink = models.CharField()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...