Django:构造动态查询

Django:构造动态查询,django,Django,我有一个表类型在“名称”栏下有德拉纳、惊悚片、科幻等的价值观。和另一张表电影。 在电影表中,类型是类型表的许多字段 情景 movie_1 = {D,S, T} movie_2 = {S,T} movie_3 = {D} movie_4 = {D, T} D:戏剧,S:科幻,T:惊悚片 案例1: 假设用户选择D和T(这是复选框选项) 当用户选择这些选项时: 我想展示电影1,电影2,电影3,电影4,这是(a)和(b)的交叉点 对于上述情况,可以进行如下查询: qs_d = Genr

我有一个表类型在“名称”栏下有德拉纳、惊悚片、科幻等的价值观。和另一张表电影。 在电影表中,类型是类型表的许多字段

情景

movie_1 = {D,S, T}
movie_2 = {S,T}
movie_3 = {D}
movie_4 = {D, T}
D:戏剧,S:科幻,T:惊悚片

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

当用户选择这些选项时: 我想展示电影1,电影2,电影3,电影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
在上述问题中,我硬编码了类型“戏剧”和“惊悚片”(用于解释),但

根据用户选择的选项数量,我将在类似{“戏剧”、“喜剧”、“颤栗”的列表中获得电影类型,在这种情况下,我如何构造查询

|
\uuuuuuuuuuuuuuuuuuu
函数,或者您可以使用
运算符。或者

所以你可以这样做:

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()

未定义的变量或?可能您有一些
名称
iterable,例如
名称=[“戏剧”、“惊悚”、“喜剧”]
的语法是否正确,不应该是like或uu(a,b)。如何导入或?请参见第一行:
来自操作员导入或
。如果语法让您感到困惑,您可能需要查看reduce的。你试过这个密码吗?这是不是给了你一个错误?如果是,什么是(完整)错误?在修复或导入后,它在电影查询中给出错误:|的不支持的操作数类型:'GREEP'和'GREEP'
m_d = Movies.objects.filter(reduce(or_, (Q(gen__id=Genre.objects.get(name=name).id) for name in names))).distinct()