2012-08-31 54 views
2

可能重複:
filter using Q object with dynamic from user?如何從request.GET參數創建過濾器?

我的工作我的應用程序的過濾功能。我發送一個逗號分隔的字符串通過jQuery到Django(在jquery中我用+替換空間,以便它可以通過電線發送)。

/?ajax&sales_item=t2,+t1 

現在,在我查看GET參數的視圖中,我可以看到Django已經用空格替換了+,這非常棒。然後,我用逗號分割關鍵字並去掉空格。

sales_item_raw = request.GET['sales_item'] 
sales_item_keywords = sales_item_raw.split(',')    

我首先需要檢查給定的名稱是否作爲銷售項目存在。我必須使用icontains,因此sales_items可以是多個項目。

for item in sales_item_keywords: 
     sales_items = profile.company.salesitem_set.filter(item_description__icontains=item.strip())    

最後但並非最不重要的查詢集用於過濾交易對給定sales_items:如果有兩個關鍵字然而

deals_queryset = deals_queryset.filter(sales_item__in=sales_items) 

如果用戶過濾器只有一個關鍵字,將做工精細,在每次循環迭代中明顯會覆蓋sales_items

什麼是解決這個問題的最高性能的方法?我應該在每次迭代時將sales_items的內容追加到循環外的列表中嗎?並最終將新列表發送到最終deals_queryset.filter

我不知道這是否是解決這個問題的好辦法......

+0

「我送通過jQuery分隔字符串的Django(逗號在jquery中,我用+替換空格,以便它可以通過電線發送)。「沒有必要; Django沒有問題處理多個GET參數[具有相同名稱](http://stackoverflow.com/q/4359238/20862)。 –

+0

感謝您指出。它不是關於多個GET參數,如果我沒有用+替換空格,我只會得到傳入的第一個參數。'/?ajax&sales_item = t2,'空格刪除了第二個參數。至少這是我的服務器上發生的事情。 – Houman

+0

'/?ajax&sales_item = t2&sales_item = t1' –

回答

0

使用Django的Q對象在你的過濾器創建「或」邏輯。

# create a chain of Qs, one for each item, and "or" them together 
q_filters = Q(item_description__icontains=sales_item_keywords[0].strip()) 
for item in sales_item_keywords[1:]: 
    q_filters = q_filters | Q(item_description__icontains=item.strip()) 

# do a single filter with the chained Qs 
profile.company.salesitem_set.filter(q_filters) 

這是醜陋的代碼,因爲我不知道如何很好地處理了最初的Q,因爲我不知道什麼是「空」 Q您可以向其中鏈中的所有其他QS,包括第一。 (我猜你可以使用Q(pk=pk)但這是在以不同的方式難看。)

編輯:以上伊格納西奧的鏈接顯示的方式,即

q_filters = reduce(operator.or_, (Q(item_description__icontains=item.strip()) for item in sales_items_keywords)) 
profile.company.salesitem_set.filter(q_filters) 
+0

'reduce()'足夠聰明......哦。你不使用'reduce()'。 –

+0

@ IgnacioVazquez-Abrams - :-)基於你的其他答案,我正在添加這個方法,同時你注意到缺少'reduce()'。 – Ghopper21

+1

啊這很好。非常感謝你。 :)它現在很好用。 – Houman