Python 具有可变数量筛选器参数的Django查询
我有一个Django查询,根据特定条件从Python 具有可变数量筛选器参数的Django查询,python,django,django-queryset,Python,Django,Django Queryset,我有一个Django查询,根据特定条件从MyModel获取: if beta: MyModel.object.filter(x=alpha, y=beta) else: MyModel.object.filter(x=alpha) 如果beta:检查并在单行中执行,即仅当beta不是无时,才在y上进行查询筛选,是否可以消除 这是一种好的(Djangonic)方式: 或者可以这样做吗(我知道下面的说法是错误的,但是可以通过修正给出正确的含义吗?) 在我看来,这不是一个好办法。我无
MyModel
获取:
if beta:
MyModel.object.filter(x=alpha, y=beta)
else:
MyModel.object.filter(x=alpha)
如果beta:检查并在单行中执行,即仅当beta
不是无时,才在y
上进行查询筛选,是否可以消除
这是一种好的(Djangonic)方式:
或者可以这样做吗(我知道下面的说法是错误的,但是可以通过修正给出正确的含义吗?)
在我看来,这不是一个好办法。我无法阅读和理解代码
您也可以这样做:
objects_ = MyModel.objects.filter(x=alpha, y=beta) if beta else MyModel.objects.filter(x=alpha)
return objects_
对我来说更干净。。但这只是我的意见。在这种情况下,我使用的解决方案如下:
filter_kwargs = {'x': alpha}
if beta:
filter_kwargs['y'] = beta
MyModel.objects.filter(**filter_kwargs)
当项目需求中出现新的条件时,很容易扩展,但不幸的是,它不是一个单一的解决方案。一种方法是使用,请参阅
就你而言:
query = Q(x=alpha)
if beta:
query = query & Q(y=beta)
MyModel.object.filter(query)
不比其他示例短,但如果您要向测试添加更多的变量,它可能会更简洁
嗯,我会用
objects = MyObject.objects.filter(x=alpha)
if beta:
# Additional filter because of ...
objects = objects.filter(y=beta)
你的方式很难理解。Python应该易于阅读。请注意,正如缓冲区所提到的,这只适用于简单过滤器(无多值关系)。否则,您最初的查询在我看来是最好的。是的。。这是你的意见。。但它并没有更多的重复性。Python程序员总是要寻找简单而干净的解决方案。注意这一点<代码>单个filter()调用中的所有内容都会同时应用,以筛选出符合所有这些要求的项。连续的filter()调用进一步限制了对象集,但对于多值关系,它们适用于链接到主模型的任何对象,而不一定是先前filter()调用选择的对象。
谢谢,我实际上不知道这方面的细节。更新了一点答案。
query = Q(x=alpha)
if beta:
query = query & Q(y=beta)
MyModel.object.filter(query)
objects = MyObject.objects.filter(x=alpha)
if beta:
# Additional filter because of ...
objects = objects.filter(y=beta)