19

名前のリストがあります。例:

name_list = ['Alpha', 'bEtA', 'omegA']

現在、次のクエリセットがあります。

MyModel.objects.filter(name__in=name_list)

大文字と小文字を区別しない方法で名前をフィルタリングできるようにしたいと思います。私が最初に考えたのはiexactフィールドルックアップを使用することでしたが、では機能しないようですiniexactクエリセットのinフィールドルックアップでを使用するにはどうすればよいですか?または、このクエリを実行する別の方法はありますか?

4

3 に答える 3

37

代わりにQオブジェクトを使用する私のソリューションは次のとおりです。

name_list = ['Alpha', 'bEtA', 'omegA']
q_list = map(lambda n: Q(name__iexact=n), name_list)
q_list = reduce(lambda a, b: a | b, q_list)
MyModel.objects.filter(q_list)
于 2013-02-16T07:52:50.350 に答える
4
name_list = ['Alpha', 'bEtA', 'omegA']
results = MyModel.objects.none()
for name in name_list:
    results |= MyModel.objects.filter(name__iexact=name)

OK、テストして動作します:)

于 2013-02-16T06:16:26.957 に答える
1

リスト内包表記を使用した例を次に示します。これはキャサリンの答えに似ていますが、デレク・クォックの答えのように1つのデータベースがヒットします(ただし、機能ではなく手続き型です)。

q_list = Q()
for q in [Q(name__iexact=n) for n in name_list]:
    q_list |= q
MyModel.objects.filter(q_list)

Pythonでzip、ma​​p、reduceなどを避けたい人のために。

于 2020-07-14T22:24:35.797 に答える