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

Mad*_*di7 0 python django relationship

我已经知道,我可以在同一模型中实现ForeignKey父子关系,从而可以与1个parent =多个孩子创建关系。但是,如何在同一模型中完成多对多关系?此刻,我编写并测试了这一点:

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

它可以工作,但不像我预期的那样。它的作用是:

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>]>
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*man 5

文档所示,您需要symmetrical=False在该字段上进行设置,以防止其自动使用相反的相同关系。为了使事情更加清楚,您可以设置related_name一些相关的内容,例如“儿童”。

parents = models.ManyToManyField(
    'self', blank=True, symmetrical=False, related_name='children'
)
Run Code Online (Sandbox Code Playgroud)

现在您可以john.children.all()得到山姆。

(请注意,由于人们对此似乎常常感到困惑,因此此处related_name并不需要;但是默认值是person_set这种情况,不如children。)