0

MultipleChoiceField オブジェクトから選択した項目のリストがあります。このリストが作成された後、Django モデル テーブルをフィルタリングして、リスト内の値のいずれかを持つすべてのアイテムを選択するにはどうすればよいですか?

たとえば、リンゴ、オレンジ、イチゴを選択した場合、fruit_name がリンゴ、オレンジ、またはイチゴである FruitChoices テーブルからすべてのデータが返されます。

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 に答える