過濾

2011-04-20 54 views
3

我的模型的相關圖像是在這裏:http://i.stack.imgur.com/xzsVU.png過濾

我需要包含誰具有相關的人與「老闆」的角色所有的貓一個QuerySet和「bob」的名字。

這個sql會顯示在下面。

select * from cat where exists 
(select 1 from person inner join role where 
person.name="bob" and role.name="owner"); 

此問題可以通過以下django過濾器解決兩個sql查詢。

people = Person.objects.filter(name="bob", role__name="owner") 
ids = [p.id for p in people] 
cats = Cat.objects.filter(id__in=ids) 

我的實際設置比這更復雜,並且正在處理大型數據集。有一種方法可以用一個查詢來做到這一點嗎?如果不可能,那麼有效的選擇是什麼?

回答

5

我敢肯定,這是你的查詢:

cats = Cat.objects.filter(person__name='bob', person__role__name='owner') 

這裏瞭解look ups spanning relationships

+0

那不是發現有一個名爲鮑勃的獸醫和誰被任命喬治所有者貓嗎?我需要兩個人都有這個問題的貓。 – DivineSlayer 2011-04-20 17:53:03

+1

我認爲除非使用'Q',否則篩選語句是'AND'ed。 – DTing 2011-04-20 17:55:27

+1

沒關係!我只是與m2ms混淆。這樣可行 – 2011-04-20 18:12:08