Django模型继承和外键

Alb*_*oPL 11 python django inheritance foreign-keys django-models

基本上,我有一个模型,我创建了一个许多其他类共享的超类,然后每个类都有一些彼此不同的独特功能.假设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.
Run Code Online (Sandbox Code Playgroud)

基本上,B类和C类都有多个D类.但是特定的D类只属于其中一个.

and*_*oke 5

一种方法是添加一个中间类,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

使用中间类(Target)可以保证从 D 到 B 或 C 之间只有一个链接。这有意义吗?有关详细信息,请参阅模型继承。

在您的数据库中,将有 Target、B、C 和 D 的表,但不会有 A,因为它被标记为抽象(相反,与 A 上的属性相关的列将出现在 Target 和 D 中)。

[警告:我实际上没有尝试过这段代码 - 欢迎任何更正!]


geo*_*wa4 3

来自Django 文档

例如,如果您正在构建“地点”数据库,您将在数据库中构建非常标准的内容,例如地址、电话号码等。然后,如果您想在地点之上构建餐馆数据库,您可以让 Restaurant 有一个 OneToOneField 来放置,而不是重复自己并复制 Restaurant 模型中的这些字段(因为餐馆“是一个”地点;在事实上,要处理这个问题,您通常会使用继承,这涉及隐式的一对一关系)。

通常,您只需继承RestaurantPlace. Restaurant可悲的是,您需要我认为的黑客:从子类到超类(到Place)进行一对一引用

  • 也许现在是这样,但我不认为*2009*是这样。 (3认同)