带列表的Django多重过滤器

时间:2013-07-10 02:52:20

标签: python django

我有一个MultipleChoiceField对象中的选定项目列表。创建此列表后,如何在Django模型表上进行过滤,以便选择列表中包含任何值的所有项目?

例如,如果我选择苹果,橙子和草莓,它会返回FruitChoices表中所有数据,其中fruit_name是苹果,橙子或草莓。

from someApp.models import FruitChoices

def main(form_list):
    r = FruitChoices

    data = {}
    for form in form_list:
        data.update(form.cleaned_data)

        fruits = data['fruit_list']

        for item in fruits:
            result = r.objects.filter(fruit_name__contains='%s' % item)

    return result

2 个答案:

答案 0 :(得分:1)

你可以做到

import operator
from django.db import Q
r.objects.filter(reduce(operator.or_, (Q(fruit_name__contains=i) for i in fruits)))

我推荐这种方法的原因是,如果你使用__in,它会匹配整个单词。但是你要找的是__contains并且没有直接在ORM中这样做的方法。因此Q个对象

这相当于:

q_list = []
for x in fruits:
    q_list.append(Q(fruit_name__contains=x)) 
q_filter = "|".join(q_list)
r.objects.filter(q_filter)

答案 1 :(得分:0)

你说过

  

其中fruit_name是苹果,橙子或草莓

  

以便选择包含列表中任何值的所有项目

但您使用的是“ _ _contains”过滤器。

你需要找到子串,即。 “糟糕的草莓”?如果没有,您可以使用“__in”过滤器,并降低整个问题的复杂性。

r.objects.filter(fruit_name__in=data['fruit_list'])