Вот мои схематические модели:
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), но это кажется волосатым, потому что я полагался бы на будущих программистов, чтобы не забыть добавлять то отношение.
Как Вы решили бы это?
Может быть, вы можете сделать свой класс 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
Общие отношения могут быть подходящим вариантом - они позволяют вам иметь структуру, подобную ForeignKey, которая указывает на любую другую модель.