2017-07-19 42 views
1

概述我怎麼能動態設置查詢參數在request.GET中的Django


與查詢參數的URL看起來像。

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

問題描述


我的搜索URL看起來像

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

我這樣做,因爲我不想透露像 '名' 和「年齡鍵做'公開,這是爲了安全抽象這些是我的數據庫表的列。

我得到的** kwargs jhon-26,我想拆它,並設置查詢參數使request.GET中,我的過濾器類將正常工作

問題


是有什麼要設置屬性request.GET?

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

我該如何做到這一點。

+0

爲什麼不把它放在會話中?並在過濾器視圖中訪問? – Exprator

+0

如何訪問我的過濾器類中的請求會話? – Satendra

+0

正如您通常在視圖中訪問會話,只需在該文件中導入請求 – Exprator

回答

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 
1

好了,你可以通過簡單的說做什麼Django的過濾器不適合你:

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) 

如果你不一定需要使用要求.GET(因爲有一種解決django-filter問題的方法),那麼你可以簡單地形成你的字典並在模型的過濾方法中使用它。

順便說一句,爲什麼你使用request.GET,如果你不想讓公衆看到你的數據?你是如何形成你的網址的?無論如何,你可能想忽略所有這些,只要你的代碼工作正常!

+0

django-filters配置允許我們使過濾變得容易並消除我們面對的開銷,如果我們爲過濾對象編寫手動查詢,還會創建一個過濾功能模塊,這是一個很好的實踐。此外,我想向公衆展示我的數據,但我只想提取直接在分表中的列的鍵,所以如果我設法做我所要求的是非常有效的方式,我猜。 – Satendra

+0

正如你所解釋的,它可以在沒有django過濾器的情況下實現。但它如何與django-filter結合使用?有沒有可能的方法? – Satendra

+1

您可能需要將您的值添加到request.GET。 'request.GET'是一個字典,所以你可以簡單地執行'request.GET ['new_key'] = value'。然而,默認情況下它是不可變的,所以你不得不通過'request.GET._mutable = True'去除不可變性** **雖然不推薦** –