【问题标题】:How to create Django Model with Many-To-Many Parents-Children Relationship?如何创建具有多对多亲子关系的 Django 模型?
【发布时间】:2018-06-28 15:41:44
【问题描述】:

我已经知道,我可以在同一个模型中实现 ForeignKey 父子关系,这允许创建与 1 个父级 = 多个子级的关系。但是我怎样才能在同一个模型中完成多对多关系呢?此时我编写并测试了这个:

class Person(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    parents = models.ManyToManyField(
        'self', blank=True
    )

它确实有效,但不像我预期的那样。它的作用是:

john = Person.objects.get(id=1)
sam = Person.objects.get(id=2)

>>> john.parents.all()
<QuerySet [<Person: Alex>, <Person: Peter>, <Person: Sam>]>
>>> sam.parents.all()
<QuerySet [<Person: John>]>

如您所见,Sam 应该是 John 的孩子,而不是他的孩子和父母。我想要的是在检索 sam.parents.all() 时获取 John,但在检索 john.parents.all() 时不获取 Sam

有没有办法完成我想要的?或者这至少不适用于这个逻辑?我是否必须使用同一个应用创建第二个单独的模型?

【问题讨论】:

    标签: python django relationship


    【解决方案1】:

    正如the docs 所示,您需要在该字段上设置symmetrical=False 以防止它自动使用相同的反向关系。为了让事情更清楚,您可以将 related_name 设置为相关的内容,例如“孩子”。

    parents = models.ManyToManyField(
        'self', blank=True, symmetrical=False, related_name='children'
    )
    

    现在您可以通过john.children.all() 获取 Sam。

    (注意,因为人们经常对此感到困惑,related_name 在这里不是必需的;但默认为person_set,在这种情况下它不像children 那样清晰。 )

    【讨论】:

      猜你喜欢
      • 2020-09-28
      • 2012-05-07
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多