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类只属于其中一个.
一种方法是添加一个中间类,如下所示:
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 中)。
[警告:我实际上没有尝试过这段代码 - 欢迎任何更正!]
来自Django 文档:
例如,如果您正在构建“地点”数据库,您将在数据库中构建非常标准的内容,例如地址、电话号码等。然后,如果您想在地点之上构建餐馆数据库,您可以让 Restaurant 有一个 OneToOneField 来放置,而不是重复自己并复制 Restaurant 模型中的这些字段(因为餐馆“是一个”地点;在事实上,要处理这个问题,您通常会使用继承,这涉及隐式的一对一关系)。
通常,您只需继承Restaurant自Place. Restaurant可悲的是,您需要我认为的黑客:从子类到超类(到Place)进行一对一引用
| 归档时间: |
|
| 查看次数: |
8980 次 |
| 最近记录: |