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

use*_*ser 4 python django django-queryset

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

if beta:
    MyModel.object.filter(x=alpha, y=beta)
else:
    MyModel.object.filter(x=alpha)
Run Code Online (Sandbox Code Playgroud)

是否有可能取消if beta:检查并在一行中完成检查,即y仅在beta未检查时才打开查询过滤器None

这是一种好方法(Djangonic):

MyModel.object.filter(**{'x':alpha, 'b':beta} if beta else **{'x':alpha})
Run Code Online (Sandbox Code Playgroud)

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

MyModel.object.filter(Q('x'=alpha) & (beta && Q('y'=beta)))
Run Code Online (Sandbox Code Playgroud)

Kam*_*ski 5

在这种情况下,我将使用以下解决方案:

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

 MyModel.objects.filter(**filter_kwargs)
Run Code Online (Sandbox Code Playgroud)

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


Sła*_*bik 0

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

你也可以这样做:

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

return objects_
Run Code Online (Sandbox Code Playgroud)

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