ForeignKey与抽象类的关系

时间:2015-01-20 22:49:06

标签: django python-3.x django-models

我想这样的话:

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

3 个答案:

答案 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)