2009-11-12 29 views
3

我有一個問題,在通過第三個表格具有多對多關係的表格上「排除」查詢。我有一個項目,一桌子人,並與這些標記的relationsship表「is_green,is_yellow,is_red」一表,如:通過第三個表格排除多對多關係

class Project(models.Model): 
    ... 

class Person(models.Model): 
    projects = models.ManyToManyField(Project, through='Status') 

class Status(models.Model): 
    person = models.ForeignKey(Person) 
    project = models.ForeignKey(Project) 
    is_green = models.BooleanField() 
    ... 

現在我想打一個查詢返回的所有人員,但不包括那些做在特定項目中標記「is_red」。但以下

Person.objects.exclude(project=p, status__is_red=True) 

排除誰在項目p註冊,但有狀態大家=紅色他註冊的任何項目。有沒有辦法將第二個條件與第一個條件聯繫起來?

我的方法是直接過濾狀態表,這當然是有效的。但是,我確實有一個「狀態」對象而不是「人」對象的列表。

回答

4

也許這樣? (未經測試)

Person.objects.exclude(id__in=Person.objects.filter(project=p, status__is_red=True).values(id)) 
+1

太棒了!這個想法按需要工作。儘管語法必須稍作修改,因爲values()會給出一個dicts列表(至少在v1.0中)。這給出了確切的結果: Person.objects.exclude(id__in = Person.objects.filter(project = p,status__is_red = True).values_list('id',flat = True)) – Daniel 2009-11-12 22:19:10

+0

啊,是的...你是正確使用values_list。對不起。 :-) – cethegeek 2009-11-12 22:55:50

0

如果你有一個名爲「對象」狀態對象的列表,你可以使用

[s.person for s in objects] 

,使之成爲相應的人員名單。

+0

感謝您的回答。但那正是我想要避免的。問題是,如果有可能在一個聲明中獲得人員名單。 – Daniel 2009-11-12 19:14:14