2013-07-03 50 views
1

我創建了一個圖書館風格的搜索形式(您可以在其中添加新信息,進一步搜索,用連接詞如AND,OR,AND NOT,OR NOT),允許他們建立的搜索語句在形式上,然後我試圖變成一個Q過濾器。出於某種原因,我生成的過濾器似乎會返回一切,如果有OR的話。 (按'或其中'我的意思是用戶選擇或作爲他們的聲明)。Django的Q過濾器工作不正常

例子:我想創造問答過濾器,這樣我會得到對象與NAME其數據域和測試作爲其值或與材料作爲其數據域和鋼作爲其值。

當我打印出來創建了Q,這是我得到:

(AND: (OR: (AND:), (AND: ('value__icontains', 'Test'), ('represents__exact', <DataField: 3-Name>)), (NOT (AND: ('value__iexact', 'Steel'), ('represents__exact', <DataField: 6-Materials>))))) 

讀這句話,好像它應該工作,但它不會做,似乎只是返回的一切。

這不正是我有,但它是一個什麼樣的形式,看起來像一個例子: enter image description here

更新: 我改變了我的代碼,這樣所得到的Q語句是這個:

(OR: (AND: ('value__icontains', 'er'), ('represents__exact', <DataField: 3-Name>)), (NOT (AND: ('value__iexact', 'er'), ('represents__exact', <DataField: 5-Keywords>)))) 

或者,在展開的形式:

(OR: 
    (AND: 
     ('value__icontains', 'er'), ('represents__exact', <DataField: 3-Name>) 
    ), 
    (NOT 
     (AND: 
      ('value__iexact', 'er'), ('represents__exact', <DataField: 5-Keywords>) 
     ) 
    ) 
) 

不過,下面的代碼打印出來的一切在數據庫中:

filtered = objects.filter(q) 
    print("Filtered: ", filtered) 

回答

2

看起來像生成查詢集的方式中的錯誤。

疏理產生Q聲明,它看起來像最AND沒有第二個表達式。

(AND: 
    (OR: 
     (AND:), 
     (AND: 
      ('value__icontains', 'Test'), 
      ('represents__exact', <DataField: 3-Name>) 
     ), 
     (NOT 
      (AND: 
       ('value__iexact', 'Steel'), 
       ('represents__exact', <DataField: 6-Materials>) 
      ) 
     ) 
    ) 
) 

而且空(AND:),會造成問題太多,所以就必須想出一個辦法刪除空Q對象

PS:這不是一個完整的答案,而是一個方向,因爲不看在代碼中可能很難找出錯誤的具體位置。

+0

的和沒有第二個表達出現問題了? –

+0

AND是一個二進制表達式。所以它需要2個表達式。不知道如何準確* * Django是處理代碼,現在你的情況 – karthikr

+0

我想我定你所描述的問題,但它仍然無法正常工作(見我的問題的更新) –