【问题标题】:I cannot output the value of the foreign key via jsonresponse serealize我无法通过 jsonresponse serialize 输出外键的值
【发布时间】:2021-03-18 02:20:55
【问题描述】:

我想将 json 序列化为 id 的产品名称。我尝试在父模型上添加 natural_keys 方法,但没有成功。

我可以很好地接收到json数据但是这样:

[{"model": "ocompra.compradetail", "pk": 1, "fields": {"producto": 238, "precio": "620.00", "cantidad": 1}}, {"模型”:“ocompra.compradetail”,“pk”:2,“字段”:{“producto”:17,“precio”:“65.00”,“cantidad”:2}}]

任何建议将不胜感激!

谢谢,

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); 
   } 
  });
});

【问题讨论】:

    标签: json django ajax foreign-keys json-deserialization


    【解决方案1】:

    解决方案是在 Articulo 的模型类中声明方法 Natural key 而不是 compraDetail one:

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

    你也检查了这个documentation

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 2020-07-03
      • 1970-01-01
      相关资源
      最近更新 更多