如何创建具有多对多父母 - 孩子关系的Django模型?

时间:2018-01-19 11:47:25

标签: python django relationship

我已经知道,我可以在同一个模型中实现ForeignKey Parent-Children关系,允许与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。

有没有办法实现我想要的?或者说至少不会使用这种逻辑?我是否必须使用相同的应用程序创建第二个单独的模型?

1 个答案:

答案 0 :(得分:3)

the docs所示,您需要在该字段上设置symmetrical=False以防止它自动使用相反的关系。为了使事情更加清晰,您可以将related_name设置为相关的内容,例如&#34; children&#34;。

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

现在你可以john.children.all()来获得Sam。

(注意,因为人们常常对此感到困惑,related_name不是必需;但默认值为person_set,在这种情况下不如children。)