我已经知道,我可以在同一个模型中实现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。有没有办法实现我想要的?或者说至少不会使用这种逻辑?我是否必须使用相同的应用程序创建第二个单独的模型?
答案 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
。)