我有一个基于某些条件从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)))
答案 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应该易于阅读。请注意,这仅适用于简单过滤器(没有多值关系),如缓冲区所述。否则,您的原始查询最适合我。