基本上,我有,我已经创建了许多其他类股的超模型,然后每个这些类的有彼此不同的一些独特的功能。 比方说,A类是超类和B类,C和d是类的子类。
这两个B类和C类可以有d级的倍数,但我已经看到了最好放在d类,然后是指它的父类的外键关系。 现在,在其他语言中,我可以简单地说,它具有A类一个ForeignKey关系,然后语言识别类真实类型。 不过,我不认为这是它与Python的作品。
什么是寻求这一问题的最好的推荐方法?
编辑:这大致就是我的意思是...
class A(models.Model):
field = models.TextField()
class B(A):
other = <class specific functionality>
class C(A):
other2 = <different functionality>
class D(A):
#I would like class D to have a foreign key to either B or C, but not both.
从本质上讲,B类和C类都有多个类D的。 但一类特殊d只属于其中之一。
从Django的文档 :
例如,如果你正在建立的“地方”的数据库,你会建立非常标准的东西,如地址,电话号码等,在数据库中。 然后,如果你想建立的地方顶部的餐馆数据库,而不是重复自己,复制在餐厅模型这些领域,你可以做餐厅有OneToOneField来放置(因为餐厅“是”的地方;在事实上,为了解决这个你通常会使用继承,这涉及到一个隐含的一个一对一的关系)。
通常情况下,你只会有Restaurant
继承Place
。 可悲的是,你需要什么,我认为黑客攻击:使从子类一到一个参考超类( Restaurant
到Place
)
你也可以做一个通用的关系http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#id1和检查类型设置或保存文档时,它限制在B或C。 这可能是比搞清楚直接引用更多的工作,但可能会感觉更干净。
要做到这一点的方法之一是如下添加一个中间类:
class A(Model):
class Meta(Model.Meta):
abstract = True
# common definitions here
class Target(A):
# this is the target for links from D - you then need to access the
# subclass through ".b" or ".c"
# (no fields here)
class B(Target):
# additional fields here
class C(Target):
# additional fields here
class D(A):
b_or_c = ForeignKey(Target)
def resolve_target(self):
# this does the work for you in testing for whether it is linked
# to a b or c instance
try:
return self.b_or_c.b
except B.DoesNotExist:
return self.b_or_c.c
使用中间级的(目标)保证只会有从d一条链路到B或C.这是否有意义吗? 见http://docs.djangoproject.com/en/1.2/topics/db/models/#model-inheritance以获取更多信息。
在你的数据库将有目标,B,C和d表,但不是一个,因为被标记为抽象的(相反,与上一个属性栏将出现在目标和d)。
[警告:我还没有真正尝试过这种代码 - 任何更正欢迎!]
我在这里看到一个问题:
class D(A):
#D has foreign key to either B or C, but not both.
不能做到这一点。 你必须同时添加,因为SQL列必须被精确定义。
此外,即使继承车型,如你有编译syncdb
-他们似乎没有表现得像你所期望的-至少我不能让他们的工作。 我无法解释为什么。
这是FK如何工作在Django
class A(models.Model):
a = models.CharField(max_length=5)
class B(models.Model):
a = model.ForeignKey(A, related_name='A')
b = models.CharField(max_length=5)
class D(models.Model):
a = model.ForeignKey(A, related_name='A')
parent = model.ForeignKey(B, related_name='D')
这种方式可以有效地具有d的倍数B.
继承在模型(如B类(A))不工作,我会想到它。 也许别人能更好地解释它。
看看这个文档页面。 这是关于多对一个在Django的关系。
b = B()
b.D_set.create(...)