2014-09-02 26 views
1

我可以通過這種標準過濾查詢嗎?像django的ORM中是否存在一個容器過濾器?

Model.objects.filter(department__is_contained=x).values_list('department') 

一些地方

x = 'AAA-BBB-CCC-DDD' 

,我的結果應該像

['AAA', 'AAA-BBB-CCC', 'BBB-CCC', 'AAA-BBB-CCC-DDD', None] 
+0

大概這個http://stackoverflow.com/q/4824759/821594可以幫助 – stalk 2014-09-02 09:01:58

+0

我真的不明白那裏發生了什麼,如果我只是試圖複製它並使其適應它,我就無法工作我的問題。什麼是Q? – confused00 2014-09-02 09:17:25

回答

1

沒有,有沒有。你想要執行的SQL看起來像這樣:

SELECT * 
FROM model 
WHERE 'AAA-BBB-CCC-DDD' like '%' + model.department + '%' 

Django當前不支持左側的過濾條件。用django 1.7使用custom lookups來實現你自己的reverse_contains查找是可能的。

class ReverseContains(Lookup): 
    lookup_name = 'rcontains' 

    def as_sql(self, qn, connection): 
     # untested! you'll have to validate this 
     lhs, lhs_params = self.process_lhs(qn, connection) 
     rhs, rhs_params = self.process_rhs(qn, connection) 
     # note we're putting the rhs sql and params on the lhs 
     params = rhs_params + lhs_params 
     return "%s LIKE '%%' + %s + '%%' " % (rhs, lhs), params 

from django.db.models.fields import CharField 
CharField.register_lookup(ReverseContains) 

並使用它像這樣:

x = 'AAA-BBB-CCC-DDD' 
Model.objects.filter(department__rcontains=x).values_list('department') 

或者你可以使用.extra(where=)直接實現搜索的SQL的一個查詢。

0

這裏顯示的東西是一個在線的解決方案:

import operator 
from django.db.models import Q 

x = 'AAA-BBB-CCC-DDD' 
User.objects.filter(reduce(operator.or_, (Q(department__contains=y) for y in x.split('-')))).values_list('department', flat=True) 

# Result will be list of 'department' fields, that contains 
# "AAA" or "BBB" or "CCC" or "DDD" 

這可能是很難了解,所以這裏是一個更詳細的變體代碼:

total_filter_q = Q() 
for y in x.split("-"): 
    total_filter_q |= Q(department__contains=y) 

# total_filter_q now represent this: 
# Q(department__contains="AAA") | Q(department__contains="BBB") | Q(department__contains="CCC") | Q(department__contains="DDD") 

User.objects.filter(total_filter_q).values_list('department', flat=True) 

結果與單行解決方案中的結果相同。

下面是一些有用的鏈接:

+0

感謝您的詳細回覆。有一個問題 - 雖然它不包含在AAA-BBB-CCC-DDD中,它是否也會獲得AAA-BBB-ZZZ? (我試圖避免這個) – confused00 2014-09-02 10:36:12

+0

是的,它會的。它會找到所有部門,包含'AAA'或'BBB'或'CCC'。如果它不是你想要的,請更精確地定義你的條件。 – stalk 2014-09-02 10:39:09

+0

對不起,我只想獲取其部門包含在一個字符串中的所有模型對象。 – confused00 2014-09-02 10:48:00