首页 > 解决方案 > Django 3.2.3 我正在尝试使用其字段和属性方法序列化对象

问题描述

我是 django 框架的新手,我只想将一个模型对象及其属性和属性作为 Json 响应返回给 ajax 调用。我有一个带有属性 balance 的 Item 模型,它返回一个整数值。这是我的代码:

模型.py

class Item(models.Model):
   entered_by = models.ForeignKey(User, on_delete=models.PROTECT)
   name = models.CharField(max_length=50, blank=True)

   @property
   def balance(self):
      return Stock.objects.filter(item_id=self.id).aggregate(Sum('quantity')).get('quantity__sum')

class Stock(models.Model):
   item = models.ForeignKey(Item, on_delete=models.PROTECT)
   name = models.CharField(max_length=50, blank=True)
   quantity = models.PositiveIntegerField()
      

序列化程序.py

from rest_framework import serializers
from .models import Item

class ItemSerializer(serializers.ModelSerializer):
   balance = serializers.SerializerMethodField(source="get_balance")

   class Meta:
      model = Item
      fields = ('entered_by', 'name', 'balance')

视图.py

from stocks.serializers import *
from django.http import HttpResponse, JsonResponse

def viewItem(request):
   if request.is_ajax and request.method == "GET":
      id = request.GET.get("item_id", None)
      item = Item.objects.get(id=id)
      if item:
         serializer = ItemSerializer()
         # return serializer.data
         return JsonResponse(serializer.data, status = 200)

我正在寻找的输出是这样的 Json 输出:

{
 name:"item name",
 entered_by: null,
 balance: 10,
}

现在这就是我得到的

{
entered_by: null
name: ""
}

任何想法都会受到赞赏。

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-serializer

解决方案


您必须在序列化程序中传递对象,因此:

serializer = ItemSerializer(item)
return JsonResponse(serializer.data, status=200)

或速记:

return JsonResponse(ItemSerializer(item).data, status=200)

编辑

对于您的序列化程序中的问题,它是因为source. 尝试将其更改为:

class ItemSerializer(serializers.ModelSerializer):
   balance = serializers.SerializerMethodField()

   class Meta:
      model = Item
      fields = ('entered_by', 'name', 'balance')

   def get_balance(self, obj)
      return obj.balance

推荐阅读