获取Django中动态过滤的URL参数
考虑一下这个网址:
www.anysite.com/get_count/?sex=5&sex=6&city=5&city=7&job=7&job=8......
在视图中使用动态查询时:
model = anyModel.objects.filter(sex=5).filter(sex=6).filter(city=5)....
我该如何在这个查询中插入网址参数呢?
2 个回答
1
URL调度器不会匹配GET查询参数,所以如果你有一个URL模式,比如url(r'^get_count$', view, name='get_count')
,那么你只需要反转这个URL并添加GET查询参数,比如:
from django.core.urlresolvers import reverse
from urllib import urlencode
query = (('sex', 5), ('sex', '6'), ('city', 5), ('city', 7))
url = `%s?%s` % (reverse('get_count'), urlencode(query))
你应该在视图中这样做,因为在模板中实现起来会有点复杂,除非你打算写静态查询,比如:
{% url 'get_content' %}?sex=5&sex=6&city=5&city=7
如果你想通过检查request.GET
在视图中动态过滤查询集,我建议你看看django-filter
。集成它非常简单,它会清理和验证GET查询,这一点开发者常常忽视,从而引入安全漏洞。使用它就像把request.GET
传递给你定义的过滤器一样,你会立即得到过滤后的查询集。
7
那这样怎么样呢?
model = anyModel.objects
for k,vals in request.GET.lists():
for v in vals:
model = model.filter(**{k: v})
或者,如果你想把过滤器的类型换成其他的,比如说 __contains
,你可以把最后一行换成类似这样的内容:
model = model.filter(**{"%s__contains" % k: v})
还有一种选择,如果你想把一个获取的变量的多个值当作 OR
来处理,可以使用 in
比较:
model = anyModel.objects
for k,vals in request.GET.lists():
model = model.filter(**{"%s__in" % k: vals})