与django中多个继承类的反向关系

时间:2010-05-22 08:10:56

标签: django django-models inheritance

以下是我的原理图模型:

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

将来我(或许是其他人)可能会想要添加更多的Bill类型。

每条法案都应该指向法律(表明该法案将改变哪些法律),我的问题是:实施此法案的最佳方式是什么? < / p>

如果我将外键(法律)添加到比尔,我将从每个比尔到法律都有关系,但法律只有反向关系票据(bill_set),与每种票据类型没有不同的反向关系。当然,我将能够过滤每种类型的账单,只获得指向特定法律的账单,但这是我认为我需要经常使用的东西,所以我认为使用privatebill_set,governmentbill_set等会产生代码更具可读性。

另一个可能的解决方案是将外键添加到每个继承类(这会给我一个privatebill_set,governmentbill_set,futurebill_set),但这看起来很毛茸茸,因为我会依赖未来的程序员记住要添加这种关系。

你会如何解决这个问题?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

Generic relations可能是这里的方式 - 它们允许你有一个类似于ForeignKey的结构,它指向任何其他模型。