【发布时间】:2021-01-28 10:49:31
【问题描述】:
I have read the Django Docs regarding symmetrical=True. 我也读过this question asking the same question for an older version of Django,但以下代码不像 Django 文档描述的那样工作。
# people.models
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=255)
friends = models.ManyToManyField("self",
through='Friendship',
through_fields=('personA', 'personB'),
symmetrical=True,
)
def __str__(self):
return self.name
class Friendship(models.Model):
personA = models.ForeignKey(Person, on_delete=models.CASCADE, related_name='personA')
personB = models.ForeignKey(Person, on_delete=models.CASCADE, related_name='personB')
start = models.DateField(null=True, blank=True)
end = models.DateField(null=True, blank=True)
def __str__(self):
return ' and '.join([str(self.personA), str(self.personB)])
如果bill 和ted 是朋友,我希望bill.friends.all() 包括ted,ted.friends.all() 包括bill。这不是发生的事情。 bill的查询包含ted,但ted的查询不包含账单。
>>> from people.models import Person, Friendship
>>> bill = Person(name='bill')
>>> bill.save()
>>> ted = Person(name='ted')
>>> ted.save()
>>> bill_and_ted = Friendship(personA=bill, personB=ted)
>>> bill_and_ted.save()
>>> bill.friends.all()
<QuerySet [<Person: ted>]>
>>> ted.friends.all()
<QuerySet []>
>>> ted.refresh_from_db()
>>> ted.friends.all()
<QuerySet []>
>>> ted = Person.objects.get(name='ted')
>>> ted.friends.all()
<QuerySet []>
这是一个错误还是我误解了什么?
编辑:更新代码以显示行为与 through_fields 设置相同。
【问题讨论】:
标签: python django django-models many-to-many django-orm