Django JSon响应格式,嵌套字段

时间:2016-08-02 04:10:26

标签: python json ajax django

我刚刚给DJango View发了一个ajax请求,它给了我回数据,但我不知道如何只得到我想要的字段。

这是我观点的一部分:

if request.method == 'POST':
        txt_codigo_producto = request.POST.get('codigobarras_producto') 
        response_data = {} 
            resp_producto=Producto.objects.all().filter(codigobarras_producto=txt_codigo_producto)
            resp_inventario=InventarioProducto.objects.all().filter(producto_codigo_producto__in=resp_producto).order_by('-idinventario_producto')[:1]
            resp_precio=Precio.objects.all().filter(producto_codigo_producto__in=resp_producto,estado_precio=1).order_by('-idprecio')[:1] #

            response_data['codprod']=serializers.serialize('json', list(resp_producto), fields=('codigo_producto')) 
            response_data['inventario']=serializers.serialize('json', list(resp_inventario), fields=('idinventario_producto'))
            response_data['nombre']=serializers.serialize('json', list(resp_producto), fields=('nombre_producto'))
            response_data['valorprod']=serializers.serialize('json', list(resp_precio), fields=('valor_precio'))

            return HttpResponse(
                json.dumps(response_data),
                content_type="application/json"
            )

“json”是我从视图中获得的数组的名称,我将其发送到控制台,如下所示:

console.log(JSON.stringify(json));

我明白了:

{"codprod":"[{\"model\": \"myapp.producto\", \"fields\": {}, \"pk\": 1}]",
    "nombre":"[{\"model\": \"myapp.producto\", \"fields\": {\"nombre_producto\": \"Pantal\\u00f3n de lona \"}, \"pk\": 1}]",
    "valorprod":"[{\"model\": \"myapp.precio\", \"fields\": {\"valor_precio\": \"250.00\"}, \"pk\": 1}]",
    "inventario":"[{\"model\": \"myapp.inventarioproducto\", \"fields\": {}, \"pk\": 1}]"}

我试过了:

console.log(JSON.stringify(json.codprod));

我得到了这个:

"[{\"model\": \"myapp.producto\", \"fields\": {}, \"pk\": 1}]" 

但如果我尝试json.codprod.pkjson.codprod[0]json.codprod["pk]之类的内容,我会在控制台中获得undefined

我想知道如何访问这些字段,在“valorprod”我想要“valor_precio”值,所以它必须是“250.00”,在“nombre”中我想要“nombre_producto”的值它必须是“ Pantal \ u00f3n de lona“。

希望你能给我一个提示。我认为这是一个JSON语法问题,但我是新手。

按照Piyush S. WanareRoshan的说明,我对视图进行了一些更改:

    resp_producto=Producto.objects.filter(codigobarras_producto=txt_codigo_producto)
            resp_inventario=InventarioProducto.objects.filter(producto_codigo_producto__in=resp_producto).order_by('-idinventario_producto')[:1].only('idinventario_producto') 
            resp_precio=Precio.objects.filter(producto_codigo_producto__in=resp_producto,estado_precio=1).order_by('-idprecio')[:1].only('valor_precio') 
            resp_productonombre=Producto.objects.filter(codigobarras_producto=txt_codigo_producto).only('nombre_producto')
            resp_productocodigo=Producto.objects.filter(codigobarras_producto=txt_codigo_producto).only('codigo_producto')

            response_data = {'codprod': resp_productocodigo,'inventario':resp_inventario,'nombre':resp_productonombre,'valorprod':resp_precio}
    return HttpResponse(
            json.dumps(list(response_data)),
            content_type="application/json"
        )

但我在控制台中得到空字段:

["nombre","valorprod","codprod","inventario"]

另一个编辑,以及有效的代码:

我使用了开头的视图,使用双重编码,我刚刚删除了“codprod”部分,但是我在ajax响应代码上写了这个:

var res_valorprod=JSON.parse(json.valorprod);
var res_inventario=JSON.parse(json.inventario);
var res_nombre=JSON.parse(json.nombre);
var campos_valorprod =res_valorprod[0].fields;
var campos_nombre =res_nombre[0].fields;
console.log(res_nombre[0].pk);
console.log(campos_valorprod.valor_precio);
console.log(res_inventario[0].pk);
console.log(campos_nombre.nombre_producto);

这是有效的,我得到了我想要的东西,但是如果你知道更好地访问多个嵌套的JSON字段,我会很高兴知道它。用户dsgdfg给了我一个提示。

2 个答案:

答案 0 :(得分:1)

您正在进行多种编码,即首先使用serializers.serialize然后使用json.dumps。

不使用序列化程序,只使用json.dumps和content_type作为json。

response_dict = {'your_data_key': 'and your values'}
return HttpResponse(
                json.dumps(response_data),
                content_type="application/json"
            )

然后在客户端,您不需要执行 JSON.stringify(json.codprod)

当您发送 content_type =' application / json' 时,它会将响应解析为json。

console.log(resp.your_data_key); #will print proper response yor data values.

答案 1 :(得分:0)

回答你的第一个问题: - 您可以按如下方式更改查询:

resp_producto=Producto.objects.filter(codigobarras_producto=txt_codigo_producto).only('requiredField')
resp_inventario=InventarioProducto.objects.filter(producto_codigo_producto__in=resp_producto).only('requiredField').order_by('-idinventario_producto')[:1]
resp_precio=Precio.objects.filter(producto_codigo_producto__in=resp_producto,estado_precio=1).only('requiredField').order_by('-idprecio')[:1]

然后序列化。

response_data['codprod']=serializers.serialize('json', list(resp_producto), fields=('codigo_producto')) 
            response_data['inventario']=serializers.serialize('json', list(resp_inventario), fields=('idinventario_producto'))
            response_data['nombre']=serializers.serialize('json', list(resp_producto), fields=('nombre_producto'))
            response_data['valorprod']=serializers.serialize('json', list(resp_precio), fields=('valor_precio'))

建议: - 如果通过迭代每个必需的对象创建单个{}并创建列表[{},{}]而不是序列化它,并按照您的方式转储它,

会更好
return HttpResponse(
                json.dumps(response_data),
                content_type="application/json"
            )

然后在FrontEnd,您应该使用JSON.parse(responceData)对其进行索引。