Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有可变数量筛选器参数的Django查询_Python_Django_Django Queryset - Fatal编程技术网

Python 具有可变数量筛选器参数的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)方式: 或者可以这样做吗(我知道下面的说法是错误的,但是可以通过修正给出正确的含义吗?) 在我看来,这不是一个好办法。我无

我有一个Django查询,根据特定条件从
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)