0

I want to get json serialized the name of the products insted of the id ones. I tried to add natural_keys method on the parent model with no luck.

I can receive the json data good but in this way:

[{"model": "ocompra.compradetail", "pk": 1, "fields": {"producto": 238, "precio": "620.00", "cantidad": 1}}, {"model": "ocompra.compradetail", "pk": 2, "fields": {"producto": 17, "precio": "65.00", "cantidad": 2}}]

Any suggestions will be much appreciated!

Thanks,

views.py

def detalle(request):
template_name = "ocompra/compra_ok.html"  
contexto={}
data={}
if request.method=="GET":  
    cat = CompraDetail.objects.all().order_by("codigo")  
    contexto={"obj":cat}  
if request.method=="POST":  
    codigos=request.POST.getlist("codigos[]")#Codigo/s de la Orden de Compra
    codigos= [int(x) for x in codigos]#Convierte la lista en integer
    items_detalle = CompraDetail.objects.filter(compra__in=codigos).select_related('producto')
    for item in items_detalle:
        print(item.producto.nombre, item.cantidad, item.precio, item.subtotal)
    #data['success'] = True
    #print (data)
    return JsonResponse(serializers.serialize('json', items_detalle,fields=('producto', 'cantidad','precio'), use_natural_foreign_keys=True), safe=False)
    #return JsonResponse(data)
return render(request,template_name,contexto)

models.py

from django.db import models
from django.utils.timezone import datetime
from articulos.models import Articulos

# Create your models here.
class CompraHead(models.Model):
numero=models.AutoField(primary_key=True)
cliente= models.CharField(max_length=200,default="Consumidor Final")
direccion=models.CharField(max_length=100,null=True,blank=True)
telefono=models.CharField(max_length=50,null=True,blank=True)
fecha=models.DateField(default=datetime.now)
observaciones=models.CharField(max_length=400)
subtotal=models.DecimalField(default=0.00,max_digits=9,decimal_places=2)
descuento=models.IntegerField(default=0.0)
total=models.DecimalField(default=0.00,max_digits=9,decimal_places=2)

class CompraDetail(models.Model):
compra=models.ForeignKey(CompraHead,on_delete=models.CASCADE)
producto=models.ForeignKey(Articulos,on_delete=models.CASCADE)
precio= models.DecimalField(max_digits=10,decimal_places=2)
cantidad=models.IntegerField(default=0)
subtotal=models.DecimalField(default=0.00,max_digits=9,decimal_places=2)

def natural_key(self):
    return (self.producto.nombre)

js

   var token = '{{csrf_token}}';  
  var data = JSON.stringify({"codigos":codigos});  
  data = {"codigos[]":codigos};  
  console.log(data);  
  $.ajax({  
   headers: { "X-CSRFToken": token },  
   "url": '/ocompra/detalle/',
   "type": "POST",  
   "dataType": "json",
   data: data,  
   success: function(data){
    //     if(data['success']){     
      //location.reload(true);
    //     alert(data)
    //   alert("Se actualizo correctamente.");
    //}
    alert(data)
    var obj = JSON.parse(data);
    for (i in obj)
      alert('Producto: '+obj[i].fields.producto +'\n' + 'Cantidad: '+ obj[i].fields.cantidad +'\n' + 'Precio: '+obj[i].fields.precio )
      
   },  
   error: function(a,b,c){  
    alert(c); 
   } 
  });
});
wwrandazzo
  • 33
  • 5

1 Answers1

0

the solution was to declarate the method Natural key in the Articulo's Model Class instead of compraDetail one:

def natural_key(self):
return (self.pk,  self.nombre, self.stock)

You also check this documentation

wwrandazzo
  • 33
  • 5