2016-08-02 105 views
0

我刚刚向DJango View发送了一个ajax请求,它给了我数据,但我不知道如何只获取我想要的字段。Django JSon响应格式,嵌套字段

这是我的观点的一部分:

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给了我一个提示。

+0

您正在对您的JSON进行双重编码 - 首先在'serializers.serialize'中,然后在'json.dumps'中... – solarissmoke

+0

在调用任何项目之前使用'JSON.parse(incoming_data)'。警告:您无法将AJAX答案移到外面。需要一些html源代码,包括'undefined'或'notwered'或''未载入'或'未转换'。 – dsgdfg

+0

不会将您的response_data转换为列表,请写入json.dumps(response_data)。 –

回答

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. 
+0

你能检查我的编辑吗?我不再使用JSON.stringify。并感谢您的帮助:D – masozow

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)对它进行索引。

+0

我已经尝试过了,但是我有些事情是错误的,我编辑了我的答案。希望你能帮助。谢谢你以前的帮助:D – masozow

+0

只需使用'json.dumps(response_data)'。我相信这是序列化数据的问题。或者尝试'serializers.serialize('json',response_data)'然后''json.dumps(response_data)'。 –

+0

我找到了一些东西,我在每个模型上定义了一个'__str__'方法,当我使用“唯一”过滤器时,这就是我所得到的,'__str__'不是必需的字段,我在Shell上做了查询,这是结果:'[]' – masozow