【问题标题】:Django Rest Framework: Loop inside JSON OBJECTDjango Rest Framework:在 JSON OBJECT 内循环
【发布时间】:2016-01-09 14:30:40
【问题描述】:

大家好,我是 Django 和 Python 的新手……我正在使用 REST 框架开发一些 Web 服务。我想遍历 JSON 项目的所有订单。来自javascript的请求是这样完成的:

    function TestDjangoPostWithNoCsrlTokenAndWithMultipleObjectsJson() {

    var JSONObject = new Object();
    JSONObject.Orders = [];
    JSONObject.Orders.push({ id: 1, Name: 'Name1', Description: 'Description1' });
    JSONObject.Orders.push({ id: 2, Name: 'Name2', Description: 'Description1' });
    JSONObject.Orders.push({ id: 3, Name: 'Name3', Description: 'Description1' });
    console.log(JSON.stringify(JSONObject));
    $.ajax
  ({
      type: "POST",
      url: URL_PostOrdersMultipleObjects,
      headers: {
          "Authorization": "Basic " + btoa("xxx" + ":" + "xxx")
      },
      data: JSONObject,
      dataType: 'json',      

      success: function (data, status, xhr) {
       console.log(JSON.stringify(data));
          if (xhr.readyState == 4) {
              if (xhr.status == 201) {
                  console.log("Created");
              }
          } else {
              console.log("NoGood");
          }
      },
      complete: function (xhr) {
      },
      error: function (xhr, ajaxOptions, thrownError) {
          console.log(xhr.status);
          console.log(thrownError);
      }
  });


}

在 Django 方面,我有...

  @api_view(['GET', 'POST'])
def JSONPostTest(request):
    if request.method == 'POST':  
        stream = io.BytesIO(request.body)
        obj = JSONParser().parse(stream)  

        for order in obj['Orders']:     # First Example

            serializer = QASerializer(data=order)
            if serializer.is_valid():
               serializer.save()
            else :
               return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)   

        return Response('OK', status=status.HTTP_201_CREATED)           
    else:
        return Response('OK', status=status.HTTP_201_CREATED) 

如果在 javascript 中我在发送对象之前对我的对象进行字符串化,则上面的代码可以正常工作。问题是当我不进行字符串化时。

如果我字符串化

request.body = 
b'{"Orders":[{"id":1,"Name":"Name1","Description":"Description1"},{"id":2,"Name":"Name2","Description":"Description2"},{"id":3,"Name":"Name3","Description":"Description3"}]}'

如果我不字符串化

request.body
b'Orders%5B0%5D%5Bid%5D=1&Orders%5B0%5D%5BName%5D=Name1&Orders%5B0%5D%5BDescription%5D=Description1&Orders%5B1%5D%5Bid%5D=2&Orders%5B1%5D%5BName%5D=Name2&Orders%5B1%5D%5BDescription%5D=Description1&Orders%5B2%5D%5Bid%5D=3&Orders%5B2%5D%5BName%5D=Name3&Orders%5B2%5D%5BDescription%5D=Description1'

request.data
<QueryDict: {'Orders[1][Description]': ['Description1'], 'Orders[2][id]': ['3'], 'Orders[0][Name]': ['Name1'], 'Orders[0][Description]': ['Description1'], 'Orders[2][Description]': ['Description1'], 'Orders[1][id]': ['2'], 'Orders[0][id]': ['1'], 'Orders[1][Name]': ['Name2'], 'Orders[2][Name]': ['Name3']}>

我可以对此进行字符串化。但我想了解是否有可能在不从我拥有的 QueryDict 开始进行字符串化的情况下获得相同的结果。

谢谢

【问题讨论】:

  • 这个问题你解决了吗?我今天面临几乎同样的问题....仍然找不到答案。

标签: javascript json django django-rest-framework


【解决方案1】:

您不仅以不必要的冗长和复杂的方式构造了 JSON 对象,而且还使用了错误的数据结构。如果你想迭代某些东西,它应该是一个数组(映射到 Python 中的列表),而不是一个对象(映射到一个字典)。您的 JS 代码应如下所示:

JSONObject.Orders = [];
JSONObject.Orders.push({id: 1, Name: 'Name1', Description: 'Description1'});
JSONObject.Orders.push({id: 2, Name: 'Name2', Description: 'Description1'});
JSONObject.Orders.push({id: 3, Name: 'Name3', Description: 'Description1'});

(实际上,您可以通过定义与数组内联的对象来使其更紧凑,但这至少现在更清楚了。)

现在,在 Python 中进行迭代很简单:

for obj in jsondata['Orders']:
    ...

【讨论】:

  • 我更改了 Javascript 代码,但对象仍然是 QueryDict。我还需要访问 JSONObject.Name。我假设 request.data 将始终是一个 QueryDict。如果我使用 JSON.stringify(JSONObject) 传递我的对象,我可以轻松地将其转换为 jsondata = request.data stream = io.BytesIO(request.body) obj = JSONParser().parse(stream) 以便在 obj 中排序['Orders']:如果我不对 JSONObject 进行字符串化,我有我在问题上发布的 querydict,我无法访问订单并在它们上循环。
  • 丹尼尔,谢谢你的回答。我现在编辑了我的问题应该更清楚了。
【解决方案2】:

由于您编写了一个用于 Order 的序列化程序,我假设它也是您后端的一个模型,并且您希望将它存储在数据库中。在这种情况下,我不会费心手动反序列化订单列表,而是让 django-restframework 将嵌套的子对象与父对象一起解包。

看看这里:https://stackoverflow.com/a/28246994/640916

【讨论】:

  • 并非如此。我有一个未连接到网络的设备,它将在本地下载产品列表并上传一个包含订单列表的 json,这是我拥有模型的那个。订单在数据库中有一个模型。订单列表没有。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 2019-08-19
  • 2023-03-14
  • 1970-01-01
  • 2021-08-03
  • 2015-09-15
  • 2016-01-29
相关资源
最近更新 更多