我想这样的话:
class F(models.Model):
class Meta:
abstract = True
class C1(F):
class C2(F):
class D(F):
pid = models.ForeignKey(Cx)
其中Cx可以是C1或C2,但我不知道它是怎么做的。
有人能引导我吗? 感谢Python 3.3 Django 1.7
答案 0 :(得分:2)
您所要求的是不可能直接的,您不能将ForeignKey用于抽象模型,因为抽象模型没有要链接的数据库表。
你可以做两件事之一。要么使F
成为一个具体的类,这有一些缺点,但这不是一个糟糕的方法。
class F(models.Model):
pass
class C1(F):
pass
class C2(F):
pass
class D(F):
pid = models.ForeignKey(F)
或者使用更复杂的GenericforeignKey
,特别是如果您需要限制模型的选择。
答案 1 :(得分:1)
正如其他回复中所提到的,由于抽象类没有表格,因此您无法与它们相关。
但是,您可以通过一对一关系模仿此行为:
class F(models.Model):
pass # stuff here
class C1(models.Model):
f = models.OneToOneField(F)
class C2(models.Model):
f = models.OneToOneField(F)
class D(F):
pid = models.ForeignKeyField(F)
您必须手动查找pid是C1还是C2,但是您永远不会有单个F实例与C1或C2的多个实例相关的情况。
答案 2 :(得分:0)
我用另一个抽象类解决了我的问题。像这样:
class F(models.Model):
class Meta:
abstract = True
class D(F):
class Meta:
abstract = True
class C1(F):
class C2(F):
class D1(D):
pid = models.ForeignKey(C1)
class D2(D):
pid = models.ForeignKey(C2)