2

「名前」列の下にドラナ、スリラー、サイエンスフィクションなどの値を持つテーブルジャンルがあります。および別のテーブルMovie。Movie テーブルのジャンルは、Genre テーブルの ManyTOManyField です。

シナリオ

movie_1 = {D,S, T}
movie_2 = {S,T}
movie_3 = {D}
movie_4 = {D, T}

D: ドラマ、S: SF、T: スリラー

ケース 1: ユーザーが D と T (チェックボックスのオプション) を選択したとします。

all D movies : movie_1, movie_3, movie_4  ---(a)
all T movies : movie_1, movie_2, movie_4  ---(b)

ユーザーがこれらのオプションを選択すると、次のようにクエリを実行できます。

        qs_d = Genre.objects.get(name="Drama")
        qs_t = Genre.objects.get(name="Thriller")
        m_d = Movies.objects.filter( Q(gen__id=qs_d.id) | Q(gen__id=qs_t.id)).distinct()
        for movie_name in m_d:
            print movie_name

上記のクエリでは、ジャンル "Drama" と "Thriller" (説明用) をハードコードしました
が、映画のジャンルは {"Drama", "Comedy" , "Thriller"} のようなリストで取得します。ユーザーが選択したオプションの数、その場合、クエリを作成するにはどうすればよいですか?

4

1 に答える 1

0

|は関数です。または、関数__or__を使用できます。operator.or_

したがって、次のようなことができます。

from operator import or_
#Uncomment for Python3
#from functools import reduce
...
qs = [Q(gen__id=Genre.objects.get(name=name).id) for name in names]
m_d = Movies.objects.filter(reduce(or_, qs)).distinct()

それはあなたが探していることをするはずです。私は Django クエリにあまり詳しくないので、もっと良い方法があるかもしれません。もちろん、次のようなものと組み合わせることができます。

m_d = Movies.objects.filter(reduce(or_, (Q(gen__id=Genre.objects.get(name=name).id) for name in names))).distinct()
于 2013-08-10T11:49:41.043 に答える