Django 3.2.3 Я пытаюсь сериализовать объект с его полями и свойствами методами
Я новичок в django framework, я просто хочу вернуть объект модели с его атрибутами и свойствами обратно на ajax вызов в виде Json ответа. У меня есть модель Item со свойством balance, которое возвращает целочисленное значение. Вот мой код:
models.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()
serializers.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')
views.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: ""
}
любая мысль будет оценена по достоинству.
Вы должны передать объект в сериализаторе, поэтому:
serializer = ItemSerializer(item)
return JsonResponse(serializer.data, status=200)
или сокращение:
return JsonResponse(ItemSerializer(item).data, status=200)
EDIT:
Что касается проблемы в вашем сериализаторе, то она связана с 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