0

我有一个来自 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
4

2 回答 2

3

你可以做

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)
于 2013-07-10T02:59:25.173 回答
0

你说过

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

以便它选择列表中具有任何值的所有项目

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

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

r.objects.filter(fruit_name__in=data['fruit_list'])
于 2013-07-10T03:22:13.867 回答