Django查询集过滤,如何过滤动态列表上的数据

时间:2017-03-08 06:40:47

标签: django python-2.7 django-queryset mongoengine

我在后端使用django 1.10和mongodb。对于mongodb我使用的是mongoengine 0.11。 在mongodb中,我有一个名为“test_coll”的集合,其中包含“name”,“dept”和“tag”字段。来自集合的样本数据如下 -

name    dept    tag
peter   dev     k1
mark    tester  k1
sachin  dev     k1
amit    manager k1

我提供清单

dept_list=['dev','tester']

此列表是动态的。

以下是函数

的代码
from mongoengine import Q
dept_list=['dev','tester']
output_list = []
query_dept objects = Q()
    for dl in dept_list:
        query_objects |= Q(dept__iexact=dl)            
    for details in test_coll.objects.filter(((Q(tag__iexact='k1')) & query_objects )):
       output_list.append({'name':details.name,'dept':details.dept,'tag':details.tag})
return output_list

根据列表dept_list=['dev','tester']和上面提供的示例数据,我从集合中获取详细信息,其中标记为'k1',dept为'dev','tester'。

所以我坚持,如果我提供,dept_list=['']包含空字符串,那么它应该返回tag ='k1'的所有数据。在我的情况下,它没有返回任何东西。 谁能提供解决方案。提前致谢。

2 个答案:

答案 0 :(得分:0)

''是dept_list中的项目:它并不意味着它是一个空列表。空列表为[]。因此,您应该在检查列表是否具有该项目的情况下进行条件设置,不要进行过滤,因为没有任何dept的值为''。或者,如果列表中有该项,请弹出它。

实际上,您的SQL查询如下所示:SELECT * FROM test_coll WHERE tag="k1" AND dept="";。进行更改我刚评论它将转向SELECT * FROM test_coll WHERE tag="k1";

答案 1 :(得分:0)

那么当dept_list = ['']时 我不得不从列表中删除空字符串 dept_list = filter(lambda item: item != '', dept_list)

修改后的代码为 -

from mongoengine import Q
dept_list=['']
query_dept objects = Q()
for dl in dept_list:
    query_objects |= Q(dept__iexact=dl)            
for details in test_coll.objects.filter(((Q(tag__iexact='k1')) & query_objects )):
   output_list.append({'name':details.name,'dept':details.dept,'tag':details.tag})
return output_list

所以这给出了预期的输出。