2

我有一个表类型,在“名称”列下具有 Drana、Thriller、Sci-fi 等值。和另一张表Movie。在电影表流派中,流派表是 ManyTOManyField

设想

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

D:戏剧,S:科幻,T:惊悚

案例 1:假设用户选择了 D 和 T(它们是复选框选项)

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

当用户选择这些选项时:我想显示movie_1,movie_2,movie_3,movie_4,这是(a)和(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", "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 回答