Django模型 - 共享公共基类的不同对象类型的外键

时间:2012-10-25 17:38:25

标签: django django-models

对于我的一个模型,我有以下概念设计。

class A(models.Model):
    ...

class B(A): #Inherits A
    fieldA = ...
    fieldB = ...

class C(A): #Inherits A
    fieldC = ...
    fieldD = ...

class D(models.Model):
    field = models.ForeignKey(A) #Here lies the problem, should store B or C

鉴于上述模型,我想将外键存储到D中的B或C,但不能同时存储

我尝试将A的Meta类属性设置为abstract,但是不允许将ForeignKey关系设置为A.我希望永远不会有A的实例而不是B或C,但如有必要,我可以使用保存信号限制此行为。

是否有更简单的设计允许我从所有类继承自公共基类的类型列表中存储外键?

1 个答案:

答案 0 :(得分:1)

我可以想到两个选择:

  1. D课程中使用generic relation而不是外键。

  2. 如果您不需要使用DB中的特定字段过滤C,则可以继续使用现有方法,但可以添加方法{ {1}}将检索D的子类:

    field

    这绝对有一些性能影响,正如您在帖子中所说,您必须手动确保class D(models.Model): field = models.ForeignKey(A) def get_field(self): try: return self.field.b except B.DoesNotExist: pass try: return self.field.c except C.DoesNotExist: pass 的每个实例都有AB子类。显然,如果你要有C个子类,这种方法不能很好地扩展。