例如:
class Contact(models.Model):
contacts = models.ManyToManyField('self', through='ContactRelationship', symmetrical=False)
symmetrical=False
参数有什么作用?
什么时候应该保留为True
,何时应该设置为False
?
此设置如何影响数据库(是否会创建额外的列等)?
答案 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
。而且,这可以通过使用直通表来实现,因为如果您使用直通表,默认情况下symmetrical
为False
:
使用中间模型的递归关系总是被定义为非对称的 - 也就是说,
symmetrical=False
- 因此,有“source”
和“target”
的概念。在这种情况下,'field1'
将被视为关系的“source”
,'field2'
将被视为“target”
。
所以你可以想象你确实需要这个方向的情况,即让我们说有一个Node
模型,并且它与自己有一个使用直通表的关系。如果我们没有这里的方向要求,我们可以使用前面显示的示例。但是现在我们还需要从一个节点到另一个节点的方向,其中一个节点是source
而另一个节点是target
,并且由于这种关系的性质,它不能是对称的。