обратная зависимость к нескольким наследующим классам в django

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

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

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

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

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

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

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

5
задан Ofri Raviv 22 May 2010 в 08:53
поделиться

2 ответа

Может быть, вы можете сделать свой класс 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
2
ответ дан 15 December 2019 в 06:18
поделиться

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

1
ответ дан 15 December 2019 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: