我有一个模型,我需要根据不同的条件进行过滤。我想避免编写复杂的嵌套条件并在每种情况下拟合模型过滤器。
有没有将filter()参数连接或组合到变量中,然后将该变量作为一组过滤器参数放在这样的?:
db_table.objects.filter(variable_of_arguments)
等于:
db_table.objects.filter(
(Q(first_name__icontains=search) |
Q(last_name__icontains=search)),
foo = True)
答案 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
# )
现在,您可以使用您想要构建的任何逻辑args
和kwargs
,并且对filter()
的调用将始终相同。
答案 2 :(得分:0)
这是一段可能会有所帮助的片段:http://djangosnippets.org/snippets/1679/