Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 与抽象类的外键关系_Django_Python 3.x_Django Models - Fatal编程技术网

Django 与抽象类的外键关系

Django 与抽象类的外键关系,django,python-3.x,django-models,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您要问的是不可能直接实现的,您不能有抽象模型的外键,因为抽象模型没有可链接的数据库表 你可以做

我是这样想的:

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

您要问的是不可能直接实现的,您不能有抽象模型的外键,因为抽象模型没有可链接的数据库表

你可以做两件事中的任何一件。或者将
F
作为一个具体的类,这有一些缺点,但这不是一个坏方法

class F(models.Model):
    pass

class C1(F):
    pass
class C2(F):
    pass

class D(F):
        pid = models.ForeignKey(F)

或者使用稍微复杂一点的表,特别是当您需要限制模型的选择时。

如另一个答复中所述,因为抽象类没有表,所以您无法与它们关联

但是,您可以通过一对一的关系来模仿这种行为:

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的多个实例相关。

我用另一个抽象类解决了我的问题。像这样:

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)