обратное отношение к множественным наследующим классам в Django - PullRequest
5 голосов
/ 22 мая 2010

Вот мои схематические модели:

class Law(models.Model):
    ... 

class Bill(models.Model):
    ... # data for a proposed law, or change of an existing law

class PrivateBill(Bill):
    ... # data for a Bill that was initiated by a parliament member

class GovernmentBill(Bill):
    ... # data for a Bill that was initiated by the government

Возможно и вероятно, что в будущем я (или, возможно, кто-то еще) захочет добавить больше типов Билла.

Каждый законопроект должен указывать на закон (указывающий, какой закон изменит этот законопроект), и мой вопрос: Каков наилучший способ реализации этого?

Если я добавлю ForeignKey (Law) к законопроекту , я буду иметь отношение из каждого законопроекта к закону, но закон будет иметь только обратное отношение к законопроектам ( bill_set), а не различное обратное отношение к каждому типу счета. Конечно, я смогу отфильтровать каждый тип счета, чтобы получить только те, которые указывают на конкретный Закон, но я думаю, что мне придется часто его использовать, поэтому я думаю, что наличие privatebill_set, Governmentbill_set и т. Д. Сделало бы код более читабельным.

Другое возможное решение - добавить внешний ключ к каждому из наследуемых классов (это даст мне privatebill_set, Governmentbill_set, futurebill_set), но это кажется проблематичным, поскольку я буду полагаться на будущих программистов не забудьте добавить это отношение.

Как бы вы решили это?

Ответы [ 2 ]

2 голосов
/ 22 мая 2010

Может быть, вы можете сделать свой класс Bill абстрактным и сделать это так:

class Bill(models.Model):
    law = models.ForeignKey(Law, related_name="%(app_label)s_%(class)s_related")

    class Meta:
        abstract = True

class PrivateBill(Bill):
    pass

class GovernmentBill(Bill):
    pass
1 голос
/ 22 мая 2010

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

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