Django的型号继承和外键(Django Model Inheritance And Foreig

2019-07-30 01:29发布

基本上,我有,我已经创建了许多其他类股的超模型,然后每个这些类的有彼此不同的一些独特的功能。 比方说,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只属于其中之一。

Answer 1:

从Django的文档 :

例如,如果你正在建立的“地方”的数据库,你会建立非常标准的东西,如地址,电话号码等,在数据库中。 然后,如果你想建立的地方顶部的餐馆数据库,而不是重复自己,复制在餐厅模型这些领域,你可以做餐厅有OneToOneField来放置(因为餐厅“是”的地方;在事实上,为了解决这个你通常会使用继承,这涉及到一个隐含的一个一对一的关系)。

通常情况下,你只会有Restaurant继承Place 。 可悲的是,你需要什么,我认为黑客攻击:使从子类一到一个参考超类( RestaurantPlace



Answer 2:

你也可以做一个通用的关系http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#id1和检查类型设置或保存文档时,它限制在B或C。 这可能是比搞清楚直接引用更多的工作,但可能会感觉更干净。



Answer 3:

要做到这一点的方法之一是如下添加一个中间类:

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)。

[警告:我还没有真正尝试过这种代码 - 任何更正欢迎!]



Answer 4:

我在这里看到一个问题:

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(...)


文章来源: Django Model Inheritance And Foreign Keys