【问题标题】:Django model with multi ForeignKey to one table [duplicate]具有多个ForeignKey的Django模型到一个表[重复]
【发布时间】:2012-01-02 19:58:31
【问题描述】:

可能重复:
Django: Why some fields clashes with other

我尝试描述模型,但 Django 报告了一些错误。我可以修复一些错误,但无法修复所有错误。然后我不会更改它以更清楚地描述我的目的:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=128)
    father_is = models.ForeignKey('self')

    def __unicode__(self):
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')
    led_by = models.ForeignKey(Person)

    def __unicode__(self):
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)
    invited_by  = models.ForeignKey(Person) # who invited this person to this group

您能建议我一个解决方案吗? (这是 2 个字段的错误:led_by 和邀请_by) 非常感谢你!

PS:我刚开始学习 Django。

编辑: 现在我知道这是关于 Django 的 ORM 的限制。 离题!

【问题讨论】:

  • 错误:一个或多个模型未验证:member.group:字段“led_by”的访问器与相关的 m2m 字段“Person.group_set”冲突。在“led_by”的定义中添加一个related_name 参数。 member.group:中间模型 Membership 对 Person 有多个外键,这是不明确的,是不允许的。 member.group:m2m 字段“members”的访问器与相关字段“Person.group_set”发生冲突。在“members”的定义中添加一个related_name 参数。
  • member.membership:字段“person”的访问器与相关字段“Person.membership_set”发生冲突。将related_name 参数添加到“人”的定义中。 member.membership:字段“invited_by”的访问器与相关字段“Person.membership_set”发生冲突。在“invited_by”的定义中添加一个related_name 参数。
  • 您是否尝试过查看消息,或者搜索其中的任何条款?你会发现这里已经得到了完整的回答。
  • @DanielRoseman 没有责任解决你的问题。当您在 Stack Overflow 上发布问题时,我们希望您已经做出了合理的努力来自己解决问题,您已经研究了错误消息,并且您已经尝试了您的研究告诉您的一切。虽然这里的用户愿意帮助您,但我们不愿意为您调试代码。

标签: django-models


【解决方案1】:

问题是您在单个模型上具有相同类型的多个外键吗?在这种情况下,django 无法为您设置自动反向关系,因此您需要明确指定related_name。有关说明,请参阅the docs

编辑: 从您的错误来看,这似乎正是问题所在。它甚至会告诉你该怎么做:

在 'members' 的定义中添加一个 related_name 参数

编辑2: 好的,现在我们到了某个地方。不过,再次,答案是“阅读文档”。来自docs on using through relations(强调添加):

中间模型有一些限制:

  • 您的中间模型必须包含一个 - 并且只有一个 - 目标模型的外键(在我们的示例中为 Person)。如果您有多个外键,则会引发验证错误。

  • 您的中间模型必须包含一个 - 并且只有一个 - 源模型的外键(在我们的示例中为 Group)。如果您有多个外键,则会引发验证错误。

【讨论】:

  • 是的,我知道(添加related_name),但它不能解决“invited_by”的问题。也许我需要稍微改变一下我的模型。你有什么想法吗?
  • 您是否已将related_name 添加到错误消息建议的所有模型的所有字段中?您是否收到新的错误消息?
  • 我将它添加到所有,新的错误消息它:错误:一个或多个模型未验证:member.group:中间模型成员资格对Person有多个外键,这是不明确的并且是不允许的。就像我说的,也许我需要改变模型。你有什么想法吗?
  • 我明白了。从您提出问题的方式来看,这一点都不清楚(因此我们所有的 cmets 关于阅读您的错误消息等)。在这一点上,我几乎会考虑关闭它,并提出一个新问题,明确说明您需要什么帮助。
  • 至于解决方案,我想你可以自己管理关系(只使用没有 m2m 字段的直通表)你会失去一些 django 魔法,但这是比盒子里更灵活的代价跨度>
猜你喜欢
  • 2016-09-06
  • 2011-01-10
  • 2020-06-06
  • 2018-08-08
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
相关资源
最近更新 更多