2013-07-04 14 views
0

我遇到了一個非常複雜的情況,因此我將給出一個簡化版本,僅包含與我的問題有關的信息:檢查是否有任何帶有外鍵的數據庫條目具有一定的值(Django)

我有一個People表和Pets表,其中有一個外鍵叫Owner。一個人可以有多個寵物。我需要根據他們的寵物搜索人桌。用戶指定類似「讓所有沒有任何名爲Philip的寵物的人」。我正在做的是使用Q對象作爲過濾器(只搜索沒有名字的寵物),然後循環獲取所有者。問題是,如果一個人有兩隻寵物,一隻寵物被命名爲菲利普,另一隻名爲Yogifnia,那麼所有者仍然會出現。

這樣做的最好方法是什麼。請注意,我需要一個可輕鬆處理請求的解決方案,例如:

「讓所有沒有任何名爲Philip的寵物的人,並且沒有任何寵物是Poodle。」

「獲取沒有名爲菲利普任何寵物或有一個名爲碧玉寵物誰所有的人」

「獲取沒有名爲菲利普任何寵物或有一個名爲碧玉寵物和寵物誰所有的人名爲安德魯「

我可以想到尷尬和低效率的解決方案,但沒有好的。

回答

2

試着這麼做了下:

People.objects.filter(~Q(pet__name = 'Philip') & ~Q(pet__type = 'poodle')) # * 
People.objects.filter(~Q(pet__name = 'Philip') | Q(pet__name = 'Jasper')) 
People.objects.filter(~Q(pet__name = 'Philip') | Q(pet__name = 'Jasper') | Q(pet__name = 'Andrew')) 

我們有哪些有寵物「菲利普」任何人,所有的寵物都沒有貴賓犬?

People.objects.filter(~Q(pet__name = 'Philip') & ~Q(pet__type = 'poodle')).exists() 

對於*,我們將有一個像接下來的查詢:

SELECT people.id, people.name FROM people 
WHERE 
(
    NOT 
    (
     (
      people.id IN 
      (
       SELECT U1.owner_id FROM pet U1 
       WHERE 
       (
        U1.name = E\'Philip\' AND U1.owner_id IS NOT NULL 
       ) 
      ) 
      AND people.id IS NOT NULL 
     ) 
    ) 
    AND NOT 
    (
     (
      people.id IN 
      (
       SELECT U1.owner_id FROM pet U1 WHERE 
       (
        U1.type = E\'poodle\' AND U1.owner_id IS NOT NULL 
       ) 
      ) 
      AND people.id IS NOT NULL 
     ) 
    ) 
); 
相關問題