4

私はMultipleChoiceField車のメーカーを保持しているフォームを持っています。車のデータベースをチェックしたメーカーにフィルターをかけたいのですが、これは問題を引き起こします。Q(make=...)すべてのステートメントを動的に取得するにはどうすればよいですか?

開始方法:['value1', 'value2', ...]

どのように終了したいですか:Q(col='value1') | Q(col='value2') | ...

私は他のいくつかの方法を持っています。各メイクにクエリセットを追加して、その逆 (複数の除外を実行) を試みましたが、どちらも非常に遅かったです。

4

3 に答える 3

6

あなたは試しましたか:Model.objects.filter(make__in=list_of_makes)

list_of_makes は、MultipleChoiceField

演算子については、クエリ セットのリファレンスを参照してください。__in

于 2008-12-09T09:21:24.830 に答える
4

#django で提供されている別のメソッドがありました。

reduce(lambda x,y: x | y, [Q1, Q2, Q3, ...])

この場合、 Ber の方法は優れていますが、動的な列でフィルター処理する必要がある場合は、マッピングが次の最もクリーンな方法のように見えます。

于 2008-12-09T09:52:23.377 に答える
3

私は Oli の答えを試しましたが、Q オブジェクトは辞書を引数として受け入れないように見えるため、reduce() を使用しても機能しませんでした。

これが私がそれをどのように機能させたかです:

# These are the fields I want to search with an OR clause
search_fields = ['title__icontains', 'publisher__name__icontains', 'authors__name__icontains']

search = 'search string'
clauses = []
for item in search_fields:
    clauses.append(queryset.filter(**{item: search}))
    queryset  = reduce(lambda x, y: x | y, clauses).distinct()

小さなデータセットでしかテストできなかったため、パフォーマンスの問題を確認してください。

于 2010-11-15T23:19:24.107 に答える