django模型过滤器问题

时间:2011-09-27 09:31:06

标签: django django-models

我有一个模型,我需要根据不同的条件进行过滤。我想避免编写复杂的嵌套条件并在每种情况下拟合模型过滤器。

有没有将filter()参数连接或组合到变量中,然后将该变量作为一组过滤器参数放在这样的?:

db_table.objects.filter(variable_of_arguments)

等于:

db_table.objects.filter(
    (Q(first_name__icontains=search) | 
     Q(last_name__icontains=search)), 
     foo = True)

3 个答案:

答案 0 :(得分:1)

我不确定,但可能你可以用2个参数来做:

param1 = Q(first_name__icontains=search) | Q(last_name__icontains=search))
param2 = {'foo', False}

db_table.objects.filter(param1, **param2)

答案 1 :(得分:1)

您可以构建可变数量的参数并按如下方式传递它们:

q = Q(first_name__icontains=search) | Q(last_name__icontains=search)
p = Q(first_in_line=True) | Q(last_in_line=True)

args = [q, p]

kwargs = {
    'foo': True
    'bar': False
}

db_table.objects.filter(*args, **kwargs)
# Equivalent to:
#
# db_table.objects.filter(
#    Q(first_name__icontains=search) | Q(last_name__icontains=search),
#    Q(first_in_line=True) | Q(last_in_line=True),
#    foo=True,
#    bar=False
# )

现在,您可以使用您想要构建的任何逻辑argskwargs,并且对filter()的调用将始终相同。

答案 2 :(得分:0)

这是一段可能会有所帮助的片段:http://djangosnippets.org/snippets/1679/