mar*_*ync 3 python django inheritance
我将一个项目从django 1.8升级到1.10,看起来django改进了外键与模型继承之间的最终名称冲突检查。这显然是一件好事,但是我需要升级的Projet很大,对模型进行重命名将是一件令人头疼的事。
让我解释一下这个问题:我有一个称为的基类Parent,许多子类链接在一起,如下所示:
class Parent(models.Model):
title = models.CharField(max_length=10)
class ChildA(Parent):
description = models.TextField()
class ChildB(Parent):
description = models.TextField()
childa = models.ForeignKey(ChildA)
Run Code Online (Sandbox Code Playgroud)
这里的冲突是一个childb对象具有2个“ childa”属性:
parent属性)。这里有两个明显的解决方案:
ChildB.childa为ChildB.somethingelseChildA模型重命名为其他名称。两种解决方案都花费很多,并且可能会引入新的错误。所以我想知道:是否可以重命名继承对象的反向相关名称?
例如 :
p = Parent.objects.get(pk=1)
print p.childa_child # Hit the ChildA instance
Run Code Online (Sandbox Code Playgroud)
我不知道我是否足够清楚,但我会将此问题保持最新状态。
====编辑====
简而言之,如果我有2个模型class Parent(models.Model)和class Child(Parent),parent.child则会创建一个动态属性。
是否可以编辑该属性名称而无需触摸类名称?
多表继承会OneToOneField在基础模型和子类之间创建一个隐式字段。
Django允许您通过将一对一显式设置为一个字段来修改此关系。
class Parent(models.Model):
title = models.CharField(max_length=10)
class ChildA(Parent):
parent = models.OneToOneField(to=Parent, parent_link=True)
description = models.TextField()
class ChildB(Parent):
parent = models.OneToOneField(to=Parent, parent_link=True)
description = models.TextField()
childa = models.ForeignKey(ChildA)
Run Code Online (Sandbox Code Playgroud)
这里重要的一点是parent_link=True告诉Django使用此字段声明来管理这两个模型的多表继承的参数。
因此,您现在可以设置related_name='+'为阻止Django创建反向关系,或者可以设置related_name为更唯一的名称:
class ChildA(Parent):
parent = models.OneToOneField(to=Parent, parent_link=True, related_name='child_a_here')
description = models.TextField()
class ChildB(Parent):
parent = models.OneToOneField(to=Parent, parent_link=True, related_name='child_b_here')
description = models.TextField()
childa = models.ForeignKey(ChildA)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1813 次 |
| 最近记录: |