Django JSon响应格式,嵌套字段

2024-10-01 17:41:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚向DJango视图发出了一个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”是我从视图获得的作为响应的数组的名称,我将其发送到控制台,如下所示:

^{pr2}$

我明白了:

{"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]或{}我会在控制台中得到{}。在

我想知道如何访问这些字段,在“valorbrod”中我想要“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给了我一个提示。在


Tags: jsonfieldsdataobjectsresponsefilterrespcodigo
2条回答

您正在进行多重编码,即首先使用序列化程序。序列化然后json.dumps文件. 在

仅供使用json.dumps文件内容类型为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。在

^{pr2}$

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

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]

然后序列化它

^{pr2}$

S建议:-它如果您通过迭代每个必需的对象并创建list[{},{}],而不是序列化它,然后像您所做的那样转储它,那么就更好了

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

那么在前端你应该使用JSON.parse(responceData)用于索引它。在

相关问题 更多 >

    热门问题