gpt4 book ai didi

django 多重继承

转载 作者:行者123 更新时间:2023-12-01 15:27:17 26 4
gpt4 key购买 nike

我目前正在做一个 django 项目,我需要做多个遗留问题。该项目本身有一个拥有多个网站的管理员。在我的管理部分,我创建了一个成员类,其中包含成员的所有必需信息。然后,所有单个站点都有一个 MemberExtra 类,该类是从管理员的 Member 类创建的,我在其中添加了所有补充信息。当我启动我的服务器 (python manage.py runserver...) 时出现错误:

Error: One or more models did not validate:
programsite.memberextra: Accessor for field 'member_ptr' clashes with related field 'Member.memberextra'. Add a related_name argument to the definition for 'member_ptr'.
programsite.memberextra: Reverse query name for field 'member_ptr' clashes with related field 'Member.memberextra'. Add a related_name argument to the definition for 'member_ptr'.
gourmandiz.memberextra: Accessor for field 'member_ptr' clashes with related field 'Member.memberextra'. Add a related_name argument to the definition for 'member_ptr'.
gourmandiz.memberextra: Reverse query name for field 'member_ptr' clashes with related field 'Member.memberextra'. Add a related_name argument to the definition for 'member_ptr'.

admin/models.py:

class Member(models.Model):
prog = models.ForeignKey(Program, verbose_name=_("Program"))
status = models.CharField(_("Status"), m status = models.CharField(_("Status"), max_length=1, choices=STATUS_CHOICE\
S)
points_avai = models.BigIntegerField(_("
Current Points"), null=True)
points_notavai = models.BigIntegerField(_("Future Points"), null=True)
cn = models.CharField(_("Company name"), max_length=250)
full_name = models.CharField(_("Full name"), max_length=250)
b_add = models.CharField(_("Billing address"), max_length=250)
b_city = models.CharField(_("Billing City"), max_length=250)
b_zip = models.CharField(_("Billing ZIP code"), max_length=250)
b_country = models.CharField(_("Billing country"), max_length=250)
prog_start_date = models.DateField(_("Program start date"), null=True)
prog_end_date = models.DateField(_("Program end date"), null=True)
member_id = models.CharField(_("Member ID"), max_length=250, primary_key=T\
rue)
client_id = models.CharField(_("Client ID"), max_length=250, help_text="Nu\
méro de client.")
user = models.OneToOneField(User)

def __unicode__(self):
return self.full_name + " (" + str(self.member_id) + ")"

class Meta:
verbose_name = _("Member")
verbose_name_plural = _("Members")

programsite/models.py:

class MemberExtra(Member):
email = models.EmailField(_("Email"), max_length=100, null=True)
tel = models.CharField(_("Tel"), max_length=100, null=True)
patrick = models.CharField(_("Patrick"), max_length=100, null=True)
test42 = models.CharField(_("Test42"), max_length=100, null=True)

gourmandiz/models.py:

class MemberExtra(Member):
email = models.EmailField(_("Email"), max_length=100, null=True)

最佳答案

这里的问题是你继承了你的模型两次,而且两个子模型都有相同的名字。这导致有两次相同的 related_name,这对 Django 来说是一个问题。

你要添加的解决方案

member = models.OneToOneField(Member, related_name="%(app_label)s_%(class)s_related")"

在你的MemberExtra模型有效,但是你失去了 Django 的隐式继承魔法,让你可以同时访问你的两个模型:

对于您的解决方案,您必须:

from programsite.models import MemberExtra
m = MemberExtra.objects.get(member__full_name = "Foobar")
m.email # -> returns the email of your MemberExtra instance
m.member.b_add # -> returns the address of the inherited member instance

在哪里,使用 Django 原生继承,您可以:

from programsite.models import MemberExtra
m = MemberExtra.objects.get(full_name = "Foobar")
m.email # -> returns the email of your MemberExtra instance
m.b_add # -> returns the address of the inherited member instance

我认为哪个更干净。

为了管理继承,Django 实际上创建了一个 OneToOneField (https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance)。该字段称为 <parentclass>_ptr , member_ptr在你的情况下。

<罢工>如果您手动创建 OneToOneField名为 <parentclass>_ptr ,并给它一个related_name,Django仍然能够找到父模型,并且不会提示相同的related_names。

在你的情况下,只需添加

member_ptr = models.OneToOneField(Member, related_name="%(app_label)s_%(class)s_related")"

在你的 MemberExtra模型定义。

这个解决方案有效,但不是它应该如何完成的。 Django 提供了一个标志 parent_link当设置为 true 时,将告诉 Django 这是将用于访问父类的字段。

所以你可以添加一个字段

member = models.OneToOneField(Member, parent_link=True, related_name="%(app_label)s_%(class)s_related")"

如果出于某种原因 Django 需要将默认指针重命名为父级,它仍然可以工作。

关于django 多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12073882/

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