如何在django中迭代queryobject?

时间:2017-04-19 12:23:59

标签: python django

我想迭代Query-object来处理并相应地发送响应。

这是有效的JavaScript部分

var msg = $.ajax({type: "GET", url: "jsonview/", async: false}).responseText;
document.write(msg);

这是有效的django views.py

from django.http import JsonResponse
def jsonview(request):
    return JsonResponse({"foo":"bar", "spam" : "no"})

我得到了结果{"foo": "bar", "spam": "no"}

但我想这样做(不要问为什么)。

var msg = $.ajax({
                    type: "GET",
                    url: "jsonview/",
                    data:{["foo","spam"]},
                    async: false
                    }).responseText;
  document.write(msg);




def jsonview(request):
      spam_dict = {"foo":"bar", "spam" : "no"}
      new_dict = {}
      for item in request.GET.get('data'):
          new_dict[item] = spam_dict[item]
    return JsonResponse(new_dict)

desired -> {"foo":"bar", "spam" : "no"}

我尝试了各种方法,比如

for item in request.GET:
for item in request.GET.get('data')

3 个答案:

答案 0 :(得分:1)

您的请求中没有data个密钥;这只是jQuery用于将数据值传递给ajax函数的参数。

另请注意,JS中的{["foo","spam"]}评估为["foo","spam"];你不能拥有没有键的对象,它只是一个数组。

由于这不是表单编码数据,因此您无法在Python中使用request.GETrequest.POST。您可以从request.body读取此数据,但最好将其作为JSON传递并在另一端解析它。所以,在JS中:

$.ajax({
    type: "POST",
    url: "jsonview/",
    data: JSON.stringify(["foo","spam"]),
    ...
});

并在Python中:

data = json.loads(request.body)

答案 1 :(得分:1)

request.GET是一个类似字典的对象,可以像任何其他Python字典一样进行迭代:

>>> from django.http.request import HttpRequest
>>> req = HttpRequest()
>>> req.GET["test"] = 5
>>> req.GET["test2"] = "pouet"
>>> for key, val in req.GET.items():
...     print(key, val)
... 
test2 pouet
test 5

简而言之,只需使用for key, val in request.GET.items():来迭代您的字典,并获取keyval个变量中的每个键和值。

附加说明:

  • for item in request.GET:只是迭代字典的键
  • for item in request.GET.get('data'):尝试迭代与dict中'data'键关联的值(不存在)
  • request.GET.items()返回一个迭代器,以元组的形式获取每个键/值对。您可以通过将元组存储在单个变量for key_value_pair in request.GET.items():中来检索元组,然后使用key_value_pair[0]访问密钥,使用key_value_pair[1]访问值。但是使用for key, val in request.GET.items():
  • 在变量中映射元组的每个值更方便

答案 2 :(得分:0)

你可以这样做

var msg = $.ajax({
                    type: "POST",
                    url: "jsonview/",
                    data: {"data": ["foo","spam"]},
                    async: false
                    }).responseText;
document.write(msg);

然后在视图中

for item in request.POST.getlist('data[]'):