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)