Django:查询使用包含列表中的每个值

时间:2011-01-28 04:09:58

标签: django django-models

我需要执行一个django查询,检查字段是否包含列表中的所有值。该清单的长度各不相同

实施例

User.objects.filter(first_name__contains=['x','y','z'])

7 个答案:

答案 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]))