1

私は Django の初心者で、モデル クエリを動的に作成する方法を理解しましたが、演算子ANDOR演算子を混在させようとすると、ある時点で行き詰まります。

フィールド (contact_name、company、position、country) のリストがあります。これらのフィールドには複数のキーワードが含まれている可能性があります (コンマ「,」で区切られています)。

したがって、これらの会社名「imtech、ABC、FooBar」を検索すると、以下のコードで正しい結果が得られます。これは、常に|(OR) 演算子を使用しているためです。

しかし、企業フィールドが「imtech、ABC、FooBar」で、かつポジション フィールドが「Account Manager」のみのエントリの検索を制限したい場合はどうすればよいでしょうか。

フィールドの各ループの最後に演算子を配置する必要があることは&わかっていますが、そうすることに成功していないので、ここに私のコードがあります。助けてください!!!

search_fields = {'contact_name', 'company', 'position', 'country'}
search_fields_values = {}
qs_params = None

for field in search_fields:
    search_fields_values[field] = self.request.GET.get(field, None)
    if search_fields_values[field]:
        search_fields_values[field] = search_fields_values[field].split(',')

        for part in search_fields_values[field]:
            q = Q(**{field: part})
            qs_params = qs_params | q if qs_params else q

qs = qs.filter(qs_params)

どうもありがとう!

4

1 に答える 1

1

あなたの質問を正しく理解できたことを願っています。

理論的には機能するはずです(ただし、テストしていません):

import operator

...

search_fields = {'contact_name', 'company', 'position', 'country'}

conditions = []
for name in search_fields:
    value = self.request.GET.get(name, None)
    if value:
        conditions.append(Q(**{name + "__in": value.split(',')}))

qs = qs.filter(reduce(operator.and_, conditions))

そこで、次の 2 つのアイデアが頭に浮かびました。

  • __in複数の OR の代わりに使用
  • in検索フィールドごとにこれらのクエリを収集し、AND で結合します

それが役立つことを願っています。

于 2013-05-06T19:52:35.027 に答える