Наследование нескольких таблиц в Django. Я не уверен, что понимаю - PullRequest
0 голосов
/ 29 сентября 2011

Я не уверен, что понимаю преимущество / цель наследования нескольких таблиц ... но это может быть то, что я ищу. Я имею дело с ресторанами. Моя текущая логика заключается в том, что у меня есть модель Company, которая, вероятно, (но не всегда) является рестораном. Иногда Компания может быть «материнской» компанией, и в этом случае модель Company имеет модель «один ко многим» с моделью Branch. Обе модели Company и Branch будут иметь общие поля, такие как адрес, контактная информация. Если у Компании есть только один «филиал», я могу предположить, что это сам Ресторан, и поэтому мне не нужно прикреплять объект Branch к Company. Имеет ли это смысл? Я знаю, что я повторяюсь с уличным адресом [...], но кажется, что это элегантный способ хранения данных, если бы я читал БД напрямую.

Я не уверен, что мне нужно наследование нескольких таблиц. Я просто не могу обернуть голову, только глядя на https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance.

edit: также открыт для принятия любых предложений по лучшему макету БД, если я делаю это неправильно.

1 Ответ

2 голосов
/ 29 сентября 2011

Наследование модели в целом полезно, поскольку вы выполняете запросы, такие как Company.objects.all (), чтобы вернуть все компании (включая рестораны), а также Restaurant.objects.all (), чтобы вернуть только ресторанные компании.Как и в случае «обычного» наследования, может быть полезно включить общие поля в родительскую (компанию) модель во все дочерние модели (ресторан).Например, все компании могут иметь поле адреса, но только рестораны могут иметь поле food_type.

Я задокументировал ссылки на несколько фрагментов, которые реализуют «набор запросов подклассов», который в основном позволяет вам выполнять запрос, например, Company.objects.all (), и возвращать вам результаты, например, [ <Ресторан>, , , <Ресторан>].Проверьте ссылку:

http://jazstudios.blogspot.com/2009/10/django-model-inheritance-with.html

Недостатком этого многостолового подхода является то, что он вводит дополнительное соединение в ваш запрос между родительской таблицей Company и дочерней таблицей Restaurant.

Альтернативой было бы создание абстрактной модели.Это создает отдельную таблицу для компании и ресторана с избыточными полями.При наследовании нескольких таблиц, если бы мы хотели найти поле адреса в экземпляре Restaurant, мы бы обратились (за кулисами) к соответствующей модели Company.С абстрактным наследованием, в таблице Restaurant будет фактически поле адреса.Кроме того, используя абстрактное наследование, я не думаю, что вы можете выполнить Company.objects.all () и ожидать, что он будет возвращать экземпляры, которые были добавлены как рестораны, а также вы не можете использовать наборы запросов подклассов из фрагментов, связанных выше.

Надеюсь, это поможет, Джо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...