Django - 获取查询参数列表

Pyt*_*ast 6 python django

我有一个端点

http://127.0.0.1:8000/auction/?status=['omn','aad']
Run Code Online (Sandbox Code Playgroud)

我需要获取状态列表,因此我执行以下操作

print (request.GET.getlist('status'))
Run Code Online (Sandbox Code Playgroud)

它归还给我

[u"['omn','aad']"]
Run Code Online (Sandbox Code Playgroud)

这是一个列表的列表.

然后我使用ast.literal_eval将列表的字符串转换为列表.有没有直接的方法来获取状态列表?

Dan*_*man 13

首先不要以那种格式发送它.为单个HTML发送多个值的标准方法是多次发送参数:

http://127.0.0.1:8000/auction/?status=omn&status=aad
Run Code Online (Sandbox Code Playgroud)

这将['omn','aad']在您使用时正确地给您request.GET.getlist('status').


Mic*_*rts 6

扩展@DanielRoseman 的答案。

正确的方法是按所述传递每个变量:http://127.0.0.1:8000/auction/?status=omn&status=aad

但是,如果您使用现代 Javascript 框架(Vue、Angular、React),则很有可能将参数作为对象传递(例如,如果您使用 axios、VueResource 等)。所以,这是解决方法:

前端:

let params = {
   status: ['omn', 'aad',]
}

return new Promise((resolve, reject) => {
  axios.get(`/auction/`, { params: params }, }).then(response => {
      resolve(response.data);
  }).catch(error => {
      resolve(error.response);
  });
});
Run Code Online (Sandbox Code Playgroud)

然后,这将按以下 URL 分派到 Django:

[05/Aug/2019 10:04:42] "GET /auction/?status[]=omn&status[]=aad HTTP/1.1" 200 2418
Run Code Online (Sandbox Code Playgroud)

然后可以在相应的视图中将其拾取为:

# Before constructing **parameters, it may neccessary to filter out any supurfluous key, value pair that do not correspond to model attributes:
parameters['status__in'] = request.GET.getlist('status[]')

# Using parameters constructed above, filter the Auctions for given status:
auctions = Auction.objects.filter(is_active=True)

auctions = auctions.filter(**parameters)
Run Code Online (Sandbox Code Playgroud)