对于我的一个模型,我有以下概念设计。
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,但如有必要,我可以使用保存信号限制此行为。
是否有更简单的设计允许我从所有类继承自公共基类的类型列表中存储外键?
答案 0 :(得分:1)
我可以想到两个选择:
在D
课程中使用generic relation而不是外键。
如果您不需要使用D
或B
中的特定字段过滤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
的每个实例都有A
或B
子类。显然,如果你要有C
个子类,这种方法不能很好地扩展。