我需要执行一个django查询,检查字段是否包含列表中的所有值。该清单的长度各不相同
实施例
User.objects.filter(first_name__contains=['x','y','z'])
答案 0 :(得分:63)
reduce(operator.and_, (Q(first_name__contains=x) for x in ['x', 'y', 'z']))
答案 1 :(得分:23)
import operator
from django.db.models import Q
q = ['x', 'y', 'z']
query = reduce(operator.and_, (Q(first_name__contains = item) for item in ['x', 'y', 'z']))
result = User.objects.filter(query)
答案 2 :(得分:1)
只是另一种方法。
qs = User.objects.all()
for search_term in ('x', 'y', 'z'):
qs = qs.filter(first_name__contains=search_term)
我不确定它是否更好,但它更具可读性。
注意:查询集是惰性的,所以这段代码进行了 1 个数据库查询。
答案 3 :(得分:0)
只是另一种方法。
qs = User.objects.all()
for search_term in ['x', 'y', 'z']:
qs = qs.filter(first_name__contains=search_term)
我不确定它是否更好,但它更具可读性。
答案 4 :(得分:0)
from django.db.models import Q
User.objects.filter(Q(first_name__contains=x)&Q(first_name__contains=y)&Q(first_name__contains=z))
在Django 1.8 python 2.7上为我工作
doc => https://docs.djangoproject.com/en/1.8/ref/models/querysets/#q-objects
有关最新=> https://docs.djangoproject.com/en/2.1/ref/models/querysets/#q-objects
答案 5 :(得分:0)
可接受的解决方案对我不起作用,但这确实可行:
list = ['x', 'y', 'z']
results = User.objects.filter(first_name__contains=list[0])
del list[0]
for l in list:
results = results.filter(first_name__contains=l)
第一个结果变量将存储具有first_name名称字段值'x'的所有对象的列表。
然后在for循环中,在第一个过滤结果中过滤“ y”。现在,您有了一个QuerySet,其中应包含可以同时找到“ x”和“ y”的项目列表。现在,您可以在其中筛选出任何也包含“ z”的项目。
这适用于任何长度列表。
答案 6 :(得分:-1)
这在 django 2.2、python 3.8 中对我有用,使用 lambda 而不是“运算符”。 可以在此处找到有关 lambda 的说明:https://www.python-course.eu/lambda.php
from functools import reduce
from django.db.models import Q
my_list = ['x','y','z']
User.objects.filter(reduce(lambda x, y: x & y, [Q(first_name__contains= i for i in my_list]))