我刚刚给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.pk
或json.codprod[0]
或json.codprod["pk]
之类的内容,我会在控制台中获得undefined
。
我想知道如何访问这些字段,在“valorprod”我想要“valor_precio”值,所以它必须是“250.00”,在“nombre”中我想要“nombre_producto”的值它必须是“ Pantal \ u00f3n de lona“。
希望你能给我一个提示。我认为这是一个JSON语法问题,但我是新手。按照Piyush S. Wanare
和Roshan
的说明,我对视图进行了一些更改:
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
给了我一个提示。
答案 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)对其进行索引。