Django继承与父对象相关的名称

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”属性:

  • “ childa”外键
  • ChildA模型继承的实例(因为childb也具有parent属性)。

这里有两个明显的解决方案:

  • 将ForeignKey重命名ChildB.childaChildB.somethingelse
  • ChildA模型重命名为其他名称。

两种解决方案都花费很多,并且可能会引入新的错误。所以我想知道:是否可以重命名继承对象的反向相关名称?

例如 :

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则会创建一个动态属性。

是否可以编辑该属性名称而无需触摸类名称?

Pau*_*ulo 5

多表继承会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)