Django构建对象过滤器与GET参数

时间:2012-01-03 23:52:32

标签: python django django-views

我有一个页面,它返回一个项目列表,因为列表大,所以我在它上面添加了一个小的过滤器表单,让用户将视图缩小到他们想要的范围。他们可以从几个下拉中选择值或将它们留空。请求就是这样:

/projects/?group=1&project_phase=

使用空的project_phase过滤器

/projects/?group=1&project_phase=2

定义项目过滤器

名称正是我能够在.filter()中定义的属性。

我坚持将过滤器字符串放在一起用于过滤器 - 是否有通用的方法来执行此操作?

2 个答案:

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