iT邦幫忙

0

django models 用filter()取值的問題

請問各位大神 我使用django套件架站
前端用jquery ajax 搜集被選到的checkbox name和value

search = $('input:checkbox:checked').serialize() ;      
$.getJSON("getcheckbox", { search },function(data){.....});

後端收到get傳來的參數
假設是 search?name1=value1&name2=value2...
不知怎麼帶入 model.objects.filter(欄位名="value") 搜尋資料庫

我想到的做法是 request.GET.get("search")取值為
name1=value1&name2=value2...
再用&和=切字串成 name1,value1,name2,value2...
帶入 model.objects.filter( name1=value1) 問題就來了
因為 name1 是一個變數名稱並不是寫死的欄位名 所以查無此欄位

請大神指點迷津!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
froce
iT邦大師 1 級 ‧ 2019-04-09 14:56:49

1.你沒搞懂Django的request.GET,把他print出來吧。
應該會看到

<QueryDict: {'name1': ['value1'], 'name2': ['value2']}>

request.GET.get("search")不會得到東西。因為你的search是網址的一部份,不是GET的一部份。

2.python支援任意數量的參數,也可以把dict很輕易的轉變成參數,下面是範例code:

def testfun(**kargv):
    print(kargv)

get_dict = request.GET.dict()
testfun(**get_dict)

不過通常我不會直接把GET轉換成dict直接餵,通常還得做欄位和資料格式驗證及轉換,天知道使用者會送啥進你server來。
http://www.wklken.me/posts/2013/12/21/how-to-use-args-and-kwargs-in-python.html

周本正 iT邦新手 5 級 ‧ 2019-04-12 14:17:17 檢舉

感謝froce大大指導 因為我是程式新手 不太懂怎麼轉換收到的值比較好 目前的作法如下 不知道效能會不會太差 或其他更好的方法

get_dict = request.GET.dict()
search = (get_dict["search"])
searchlist = search.split('&')

search_dic = {}
    
for atrr in searchlist:
    name = atrr[0:atrr.find("=")]
    value = atrr[atrr.find("=")+1 :]
    search_dic[name]=value
    
results = Wheelchair.objects.all()
    
if "subsidy_type" in search_dic :
    results = Wheelchair.objects.filter(subsidy_type = search_dic["subsidy_type"])
    
if "seat_width" in search_dic :
   results = results.filter(seat_width=search_dic["seat_width"])
froce iT邦大師 1 級 ‧ 2019-04-15 14:25:23 檢舉

唉,我覺得我說了你看不懂,直接給你code,不過你自己好自為之:

get_dict = request.GET.dict()
result = Wheelchair.objects.filter(**get_dict)
search = (get_dict["search"])

這句你根本得不到東西,你也沒搞清楚Django的request.GET的結構是啥,根本也不用你自己去那樣處理GET字串,如果還得做那麼低階的處理,Django不會紅。

周本正 iT邦新手 5 級 ‧ 2019-05-02 15:10:57 檢舉

感謝大神 我再慢慢學習

我要發表回答

立即登入回答