我有一个页面,它返回一个项目列表,因为列表大,所以我在它上面添加了一个小的过滤器表单,让用户将视图缩小到他们想要的范围。他们可以从几个下拉中选择值或将它们留空。请求就是这样:
/projects/?group=1&project_phase=
使用空的project_phase过滤器
或
/projects/?group=1&project_phase=2
定义项目过滤器
名称正是我能够在.filter()中定义的属性。
我坚持将过滤器字符串放在一起用于过滤器 - 是否有通用的方法来执行此操作?
答案 0 :(得分:2)
也许你可以使用:
parameters = {field_name: value for field_name, value in request.GET.items()
if value and field_name in model._meta.get_all_field_names()}
model.objects.filter(**parameters)
根据以下评论的建议,可以通过几项检查来忽略不需要的参数:
这应该按照您的预期将GET请求中的所有参数传递给filter
方法。
答案 1 :(得分:0)
你也可以链接过滤器(这是伪的,但应该给你一个想法):
filter_mapping = dict()
filter_mapping['g'] = 'group'
filter_mapping['project'] = 'project_phase'
# .. etc...
o = Model.objects.all() # No filtering (default)
for k in request.GET.items():
if k in filter_mapping.keys():
o.filter(filter_mapping[k]=request.GET.get(k))