gpt4 book ai didi

python - Django继承与父对象相关名称

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:13 24 4
gpt4 key购买 nike

我正在将一个项目从 django 1.8 升级到 1.10,看起来 django 改进了对外键和模型继承之间最终名称冲突的检查。这显然是一件好事,但我需要升级的项目很大,重命名模型会很糟糕。

让我解释一下这个问题:我有一个名为 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)

这里的冲突是 childb 对象有 2 个“childa”属性:

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

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

  • 将外键 ChildB.childa 重命名为 ChildB.somethingelse
  • ChildA 模型重命名为其他名称。

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

例如:

p = Parent.objects.get(pk=1)
print p.childa_child # Hit the ChildA instance

我不知道我是否足够清楚,但我会及时更新这个问题。

==== 编辑 ====

为了更简洁,如果我有 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)

这里重要的一点是 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)

关于python - Django继承与父对象相关名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40343238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com