参数为none django时查询

时间:2011-08-10 06:45:20

标签: python mysql django django-models

我想进行查询,例如

Model.objects.filter(x=x).filter(y=y).filter(z=z) 

...但在某些情况下例如y为None。这在字面上搜索数据库中的y列中的空值 - 如果它是无,则有一种基本上忽略该查询参数的方法,即返回查询集

Model.objects.filter(x=x).filter(z=z)?

5 个答案:

答案 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)
...

如果有太多的论据要处理,你可以使用这样的东西;假设xyz存储在字典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)