我可以通過這種標準過濾查詢嗎?像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]
我可以通過這種標準過濾查詢嗎?像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]
沒有,有沒有。你想要執行的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的一個查詢。
這裏顯示的東西是一個在線的解決方案:
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)
結果與單行解決方案中的結果相同。
下面是一些有用的鏈接:
感謝您的詳細回覆。有一個問題 - 雖然它不包含在AAA-BBB-CCC-DDD中,它是否也會獲得AAA-BBB-ZZZ? (我試圖避免這個) – confused00 2014-09-02 10:36:12
是的,它會的。它會找到所有部門,包含'AAA'或'BBB'或'CCC'。如果它不是你想要的,請更精確地定義你的條件。 – stalk 2014-09-02 10:39:09
對不起,我只想獲取其部門包含在一個字符串中的所有模型對象。 – confused00 2014-09-02 10:48:00
大概這個http://stackoverflow.com/q/4824759/821594可以幫助 – stalk 2014-09-02 09:01:58
我真的不明白那裏發生了什麼,如果我只是試圖複製它並使其適應它,我就無法工作我的問題。什麼是Q? – confused00 2014-09-02 09:17:25