我有一个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
答案 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'])