概览
查询参数的网址如下所示。
http://example.api.com/search/?name=jhon&age=26
并且在查看我是否正在使用django-filter时,会自动从请求中提取所有参数,并返回已过滤的查询集。
views.py
class SearchView(TemplateView):
template_name = "search.html"
def get_queryset(self):
return SearchFilter(request.GET, queryset=Model.objects.all()).qs
def get_context_data(self, **kwargs):
context = super(SearchView, self).get_context_data(**kwargs)
return context
如果我想从request.GET手动提取它,我可以这样做。
def get_queryset(self):
# extracting query parameter
q = self.request.GET.get('name')
问题陈述
我的搜索网址看起来像
http://example.api.com/search/jhon-26
我这样做是因为我不想透露姓名'姓名'和'年龄'对于公共,这是为了安全抽象,这些是我的db表的列。
我在** kwargs中得到jhon-26
,我想将其拆分并设置为request.GET的查询参数,以便我的过滤器类可以正常工作
问题
是否有任何设置属性的要求.GET?
# may be any set function available for this
self.request.GET.set('name', 'jhon')
我怎样才能实现这一点。
答案 0 :(得分:1)
嗯,你可以通过简单地说:
来做django-filter为你做的事情 result = Model.objects.filter(**dict)
但是,对于request.GET,您必须将其格式化为有效字典,因为它的值通常是列表。你可以这样做:
formatted = {key: dictionary.get(key)[0] for key in dict(request.GET).keys()}
然后您可以将剩余的变量添加到其中:
formatted['age'] = 26 //As extracted from **kwargs. etc.
然后做:
result = Model.objects.filter(**formatted)
如果你不一定需要使用request.GET(因为有一种方法可以解决django-filter的作用),那么你可以简单地形成你的字典并在模型的过滤方法中使用它。
顺便问一下,如果你不希望公众看到你的数据,你为什么要使用request.GET?你是怎么形成你的网址的?你可能想要忽略所有这些,只要你的代码工作正常!
答案 1 :(得分:1)
我找到了将查询参数设置为request.GET here
的解决方案作为request.GET QueryDict实例是不可变的,所以我们不能直接修改它,所以我们需要将它的_mutable属性设置为True
if not request.GET._mutable:
request.GET._mutable = True
# now you can edit it
request.GET['name'] = 'jhon'
request.GET['age'] = 26
答案 2 :(得分:1)
query_data={}
name = request.query_params.get('name')
age = request.query_params.get('age')
if name is not None:
query_data['name'] = name
if age is not None:
query_data['age'] = age
return Model.objects.filter(**query_data)