在Django中,symmetrical = True有什么作用?

时间:2016-04-25 22:37:52

标签: django django-models

例如:

class Contact(models.Model):
    contacts = models.ManyToManyField('self', through='ContactRelationship', symmetrical=False)

symmetrical=False参数有什么作用?

什么时候应该保留为True,何时应该设置为False

此设置如何影响数据库(是否会创建额外的列等)?

2 个答案:

答案 0 :(得分:6)

我们假设您有两个联系人,John和Judy。你可以决定让约翰成为朱迪的联系人。这个行动是否也应该让朱迪成为约翰的联系人?如果是,symmetrical=True。如果没有,symmetrical=False

答案 1 :(得分:4)

以下是documentation中的内容:

  

仅在自我的ManyToManyFields定义中使用。考虑以下模型:

from django.db import models

class Person(models.Model):
    friends = models.ManyToManyField("self")
     

当Django处理此模型时,它会识别出它自身有ManyToManyField,因此,它不会向person_set类添加Person属性。相反,ManyToManyField被假定为symmetrical - 也就是说,如果我是你的朋友,那么你就是我的朋友。

默认情况下,对于多对多字段,symmetrical的值为True,这是一种双向关系。

使用直通表(对称=假):

但您也可以想象一下您不需要这种关系的情况,因此您可以添加symmetrical=False。而且,这可以通过使用直通表来实现,因为如果您使用直通表,默认情况下symmetricalFalse

  

使用中间模型的递归关系总是被定义为非对称的 - 也就是说,symmetrical=False - 因此,有“source”“target”的概念。在这种情况下,'field1'将被视为关系的“source”'field2'将被视为“target”

所以你可以想象你确实需要这个方向的情况,即让我们说有一个Node模型,并且它与自己有一个使用直通表的关系。如果我们没有这里的方向要求,我们可以使用前面显示的示例。但是现在我们还需要从一个节点到另一个节点的方向,其中一个节点是source而另一个节点是target,并且由于这种关系的性质,它不能是对称的。