如何在Django中动态设置查询参数到request.GET

时间:2017-07-19 11:09:29

标签: python django http request

概览

查询参数的网址如下所示。

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')

我怎样才能实现这一点。

3 个答案:

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