Django查询具有可变数量的过滤器参数

时间:2014-05-20 07:11:19

标签: python django django-queryset

我有一个基于某些条件从MyModel获取的Django查询:

if beta:
    MyModel.object.filter(x=alpha, y=beta)
else:
    MyModel.object.filter(x=alpha)

是否可以取消if beta:检查并在一行中执行,即仅在y不是beta时才在None上进行查询过滤

这是一种很好的(Djangonic)方式:

MyModel.object.filter(**{'x':alpha, 'b':beta} if beta else **{'x':alpha})

或者可以做这样的事情(我知道以下是错误的,但是可以修复它以给出正确的含义吗?):

MyModel.object.filter(Q('x'=alpha) & (beta && Q('y'=beta)))

4 个答案:

答案 0 :(得分:4)

在这种情况下,我正在使用如下解决方案:

filter_kwargs = {'x': alpha}
if beta:
    filter_kwargs['y'] = beta

 MyModel.objects.filter(**filter_kwargs)

当新条件进入项目要求时很容易扩展,但遗憾的是它不是单线解决方案。

答案 1 :(得分:1)

在我看来,这不是一个好的解决方案。我有阅读和理解代码的问题。

您也可以这样做:

objects_ = MyModel.objects.filter(x=alpha, y=beta) if beta else MyModel.objects.filter(x=alpha)

return objects_

对我来说它更干净..但这只是我的意见。

答案 2 :(得分:0)

一种方法是使用Q objects,请参阅this answer

在你的情况下:

query = Q(x=alpha)
if beta:
    query = query & Q(y=beta)
MyModel.object.filter(query)

不短于其他示例,但如果要添加更多变量进行测试,它可能会更清晰。

HTH,

答案 3 :(得分:0)

我会用

objects = MyObject.objects.filter(x=alpha)
if beta:
    # Additional filter because of ...
    objects = objects.filter(y=beta)

你的方式很难阅读。 Python应该易于阅读。请注意,这仅适用于简单过滤器(没有多值关系),如缓冲区所述。否则,您的原始查询最适合我。