2014-04-18 28 views
2

我正在爲自動完成表單編寫後端代碼。我返回的每個條目都由該類別中的類別名稱和數字來描述。Django過濾器中的「In」或「reverse contains」查詢用於比較字符串

當用戶鍵入「CAT123」時,我想使用Django過濾器過濾到用戶查詢中包含的類別名稱或數字。

換句話說,我想執行類似的查詢:

Entry.objects.filter(Q(category__in = query) | Q(num__in = query)) 

其中過濾器測試,如果AAA類是在查詢AAA 555,如果數量555是分別查詢AAA 555

但是,__in似乎只適用於列表,而__contains檢查另一種方式('AAA 555'不在'AAA'中)。

什麼是正確的過濾器表達式用於此「包含在一個字符串」的想法?

或者有沒有辦法將contains表達式顛倒過來,以便過濾器看起來像Q(query__contains = category)

回答

0

您應該使用__contains但您應該將查詢拆分爲類別和數字部分之前您使用它。這是使用正則表達式的好例子。下面是一個簡單的例子,但請注意,這對unicode類別名稱不適用(例如,使用字母如üéø)。如果您想要更靈活的正則表達式,請參閱更多教程。

import re 

entries = [ 
     "sdf", 
     "A124", 
     "124", 
     "ASDF 124", 
     ] 

for i, e in enumerate(entries): 
    number = re.search(r'\d+', e) 
    word = re.search(r'[A-Za-z]+', e) 
    print i 
    if number: 
     print(" " + number.group()) 
    if word: 
     print(" " + word.group()) 

回報:

0 
    sdf 
1 
    124 
    A 
2 
    124 
3 
    124 
    ASDF 

你會使用捕獲的比賽是這樣的:

Entry.objects.filter(Q(category__contains = word) | Q(num__contains = number))