-1

私は次のクエリを持っています:

things = Thing.objects.filter(tags__in=selected_tags).distinct()

selected_tagsが次のようになっている場合:

selected_tags = [<Tag: tag1>, <Tag: tag2>]

そうすれば、tag1またはtag2を持つものがすべて含まれます。

tag1とtag2(そしておそらくtag3ですが、必ずしもそうとは限りません)を持つものを取得するクエリが必要です。これを行うための最良の方法は何ですか?

4

1 に答える 1

1

__in本質的にORベースです。文字通り、これらのタグのいずれかを持つ行をすべて引き出すと言います。ANDベースのクエリを作成するには、タグごとに個別にフィルタリングする必要があります。

Thing.objects.filter(tags=tag1, tags=tag2, ...)

これは明らかに理想的ではありません。残念ながら、このシナリオでは、すべてのキーが同じであるため、拡張辞書を使用することもできません。したがって、他の唯一のオプションは次を使用することQです。

from django.db.models import Q

query = None
for tag in tags:
    if query is None:
        query = Q(tags=tag)
    else:
        query &= Q(tags=tag)

things = Thing.objects.filter(query)

少し複雑ですが、(検索する各タグをハードコーディングするだけでなく)クエリを動的に作成する必要がある場合は、それが最善の策です。

于 2012-07-06T22:09:11.817 に答える