【发布时间】:2011-08-19 15:55:17
【问题描述】:
来自 Django 的官方文档:https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships
模型如下:
class Person(models.Model):
name = models.CharField(max_length=128)
def __unicode__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __unicode__(self):
return self.name
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
最后给出了这样一个例子:
# Find all the members of the Beatles that joined after 1 Jan 1961
>>> Person.objects.filter(
... group__name='The Beatles',
... membership__date_joined__gt=date(1961,1,1))
[<Person: Ringo Starr]
我的问题是 Person 模型如何知道组和成员属性,因为它们没有在其上定义。它只是一种多对多的魔法,还是 Django 中的某种通用魔法?
如果我要实现相同的查询,我会认为下面的代码更自然(从 Django 的 orm 角度来看,而不是从业务角度来看):
Membership.objects.filter(group__name='The Beatles', date_joined__gt=date(1961,1,1))).select_related('person')
编辑 我再次阅读了该文件,发现这种倒退是普遍的。在https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships 段中,它提到:
它也可以向后工作。要引用“反向”关系,只需 使用模型的小写名称。
我以前从未使用过这种向后查询。所以我第一次看到它时,它撞到了我的大脑。对不起,这个线程原来是愚蠢的。但我希望它可以帮助那些跳过该段中非常(细)行的人。
【问题讨论】:
标签: python django many-to-many