带有OR语句的Django过滤器

时间:2017-07-22 11:25:56

标签: python django

我需要编写过滤器来检查以下情况:

如果有名字的演员" John"而不是返回这些演员,否则搜索名为" David"的演员。

伪代码可能看起来像:

Actors.filter(name="John" or name="David")

我可以使用一个查询在Django中执行类似的操作吗?或者我必须使用if

actors = Actor.filter(name="John")
if not actors.exists():
    actors = Actors.filter(name="David")

1 个答案:

答案 0 :(得分:5)

您可以使用Q个对象。 Django docs 提供有关Q对象的更详细说明。简而言之,它允许您执行更复杂的查询,例如ANDOR查询。 特别针对您的问题,您可以这样做:

Actor.objects.filter(Q(name="John") | Q(name="David"))

一般来说,这里有一些你可以用Q个对象做的很酷的东西。

您也可以使用Q创建动态查询。例如:

    import operator
    try:
        from functools import reduce
    except ImportError:  # Python < 3
        pass

    q_list = [Q(question__contains='dinner'), Q(question__contains='meal')]
    Poll.objects.filter(reduce(operator.or_, q_list))

此帖中的示例取自this post.