我想进行查询,例如
Model.objects.filter(x=x).filter(y=y).filter(z=z)
...但在某些情况下例如y为None。这在字面上搜索数据库中的y列中的空值 - 如果它是无,则有一种基本上忽略该查询参数的方法,即返回查询集
Model.objects.filter(x=x).filter(z=z)?
答案 0 :(得分:14)
我不知道,如果我得到你的问题,但是
Model.objects.filter(x=x, y__isnull = False, z=z)
为您提供了查询集,其中y
列为非空(IS NOT NULL
)。
Here's相关文档。
编辑:检查y是否为None并动态构建您的查询集:
if y is None:
qs = Model.objects.filter(x=x).filter(z=z)
elif z is None:
qs = Model.objects.filter(x=x).filter(y=y)
...
如果有太多的论据要处理,你可以使用这样的东西;假设x
,y
,z
存储在字典your values
中:
your_values = { 'x' : 'x value', 'y' : 'y value', 'z' : 'value'}
arguments = {}
for k, v in your_values.items():
if v:
arguments[k] = v
Model.objects.filter(**arguments)
答案 1 :(得分:4)
这样的事情可行:
models = Model.objects.all()
variables = {'x':'x','y':'y','z':'z'}
for key, value in variables.items():
if key=='x' and value:
models = models.filter(x=value)
if key=='y' and value:
models = models.filter(y=value)
if key=='z' and value:
models = models.filter(z=value)
因为QuerySets are lazy,这不涉及任何数据库活动。
答案 2 :(得分:2)
您可以创建模型管理器,然后将其分配给模型,以便将此管理器用于任何模型。这种解决方案更具有pythonic。
class GridManager(models.Manager):
def applyFilters(self, *args, **kwargs):
new_kwargs = {}
for eachKey in kwargs:
val = kwargs[eachKey]
if val != '' and val != None:
new_kwargs[eachKey] = val
if new_kwargs:
return super(GridManager, self).get_query_set().filter(*args, **new_kwargs)
else:
return super(GridManager, self).get_query_set()
将此经理分配给您的模特:
class some_model(models.Model):
your fields.....
......
objects = models.Manager()
grid_manager = GridManager()
在您看来,您可以将以上经理用作:
objects = some_model.grid_manager.applyFilters(x=value, y = value, z = None)
现在您不必担心无值。希望这会有所帮助。
答案 3 :(得分:1)
对于非常易读的@滚石答案的更好的方法:
models = Model.objects.all()
variables = {'x':x,'y':y,'z':z}
for key, value in variables.items():
if value is not None:
models = models.filter(**{key: value})
无论如何,根据具体的过滤器,您需要在同一个.filter()调用中一起应用过滤器,因此“盲”方式仅适用于简单的情况。有关这些案例的更多信息,请参阅https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships。
答案 4 :(得分:0)
你可以写:
filters = {'x':'abc', 'y':None, 'z':2}
# here we filter out the None values of the dict
filters = dict(filter(lambda (k, v): v is not None, filters.items()))
# We use the dict to create the query
qs = Model.objects.filter(**filters)