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

2024-04-26 00:14:07 发布

您现在位置:Python中文网/ 问答频道 /正文

概述


带有查询参数的url看起来像。

http://example.api.com/search/?name=jhon&age=26

在视图中,如果我使用django-filter,所有参数都将从请求中自动提取,并且它将返回一个筛选的查询集。

视图.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')

问题陈述


我的搜索url看起来像

 http://example.api.com/search/jhon-26

我这样做是因为我不想公开“name”和“age”这样的密钥,这是为了安全抽象,这是我的db表的列。

我正在**kwargs中获取jhon-26,我想将其拆分并设置为request.GET的查询参数,以便我的筛选器类可以正常工作

问题


有什么要设置的属性是request.GET吗?

# may be any set function available for this
self.request.GET.set('name', 'jhon')

我怎样才能做到这一点。


Tags: nameselfhttpurlsearch参数getexample
2条回答

我找到了将查询参数设置为request.GEThere的解决方案

由于request.GET QueryDict实例是不可变的,因此我们不能直接修改它,因此需要将其可变属性设置为True

if not request.GET._mutable:
   request.GET._mutable = True

# now you can edit it
request.GET['name'] = 'jhon'
request.GET['age'] = 26

好吧,你可以像django filter那样简单地说:

  result = Model.objects.filter(**dict)

但是,对于request.GET,由于它的值通常是list,因此必须对其进行格式化才能生成有效的字典。你可以简单地做:

  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有一种方法),那么您可以简单地形成字典并在模型的filter方法中使用它。

顺便问一下,如果您不想让公众看到您的数据,为什么要使用request.GET?你的网址是怎么形成的?你可能想忽略所有这些,只要你的代码工作正常无论如何!

相关问题 更多 >