2016-04-16 72 views
0
class Person(models.Model): 
    age = models.IntegerField() 

class Group(models.Model): 
    people = models.ManyToManyField(Person,through=Membership) 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    existing = models.BooleanField() 

這是簡化的類結構和什麼我想查詢的是: 在A組的查詢集,使得有一些人憑會員,使得existing是真實的。 我嘗試過使用Group.objects.filter(membership__existing=True),但它似乎抓住了所有的組。如何查詢ManyToMany與django中某些屬性的關係?

過濾查詢集的最有效方法是什麼?

回答

0

我使用模型定義創建了一個示例應用程序,並且您指定的過濾器正常工作。我必須將people字段的through屬性更改爲字符串,因爲尚未定義Membership。我還爲Group添加了一個名稱字段,以便於測試。

class Person(models.Model): 
    age = models.IntegerField() 

class Group(models.Model): 
    name = models.CharField(max_length=255) 
    people = models.ManyToManyField(Person, through='Membership') 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    existing = models.BooleanField() 

然後在控制檯:

>>> p1 = Person.objects.create(age=10) 
>>> p2 = Person.objects.create(age=20) 
>>> has_existing = Group.objects.create(name='has_existing') 
>>> has_non_existing = Group.objects.create(name='has_non_existing') 
>>> has_none = Group.objects.create(name='has_none') 
>>> Membership.objects.create(person=p1, group=has_existing, existing=True) 
>>> Membership.objects.create(person=p2, group=has_non_existing, existing=False) 
>>> existing = Group.objects.filter(membership__existing=True) 
>>> assert(len(existing) == 1) 
>>> assert(existing[0].name == 'has_existing') 
+0

謝謝你的評論。我再次測試並注意到我的真實代碼使用了'NullBooleanField',我想要的條件是null。所以我使用了'filter(membership__existing__isnull = True)',其中也包括那些沒有任何成員身份的人。在更改爲'filter(membership__isnull = False,membership__existing__isnull = True)'後,正常工作 –