這是一個從Django的官方文檔:https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationshipsdjango:在多對多的關係中,多餘的領域是否有黑魔法?
的模型是這樣的:
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]
我的問題是人的模型是如何知道因爲它們沒有被定義在一個組和成員屬性中。它只是通過許多方面的魔法,或者它是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中,它提到:
它也向後工作。要引用「反向」關係,只需使用模型的小寫名稱 。
我從來沒有用過這個向後查詢。所以我第一次看到它,它激怒了我的大腦。對不起,這個線程原來是愚蠢的。但我希望它能幫助那些跳過該段中非常細線的人。
我可以完全理解你的例子,因爲樂隊是在音樂家模型中定義的外鍵。但在我的問題中,Person模型沒有定義人物屬性。爲了回答我的問題,請告訴我如何做相反的事情,比如Band.objects.filter(musician__name ='Ringo Starr')。 –
這是相同的基本機制。 django ORM將您的django查詢轉換爲SQL。我將用一個例子來編輯。 –
感謝您的解釋。我再次閱讀文檔並意識到反向查詢是可能的。但它是一個單線的東西。所以我想我的眼睛剛剛跳過它。 –