Django Serializer Передача аргументов в функцию модели

Новичок в Django и DRF, у меня есть метод в свойствах модели, который принимает аргументы. Мне удалось успешно вызвать его через класс сериализатора с параметрами по умолчанию и получить ответ в формате JSON. Моя проблема в том, что я не могу передать аргумент в эту функцию под названием balance. Я успешно передаю аргументы от представления к классу сериализатора, но от сериализатора к модели, где я потерпел неудачу. Буду признателен за помощь.

model.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, stock_type='Retail'):
      stock = Stock.objects.filter(item=self, type=stock_type, status='InStock').aggregate(models.Sum('quantity')).get('quantity__sum')
      return stock or 0

views.py

def getItemInfo(request):
   if request.is_ajax and request.method == "GET":
      id = request.GET.get("item_id", None)
      sell_type = request.GET.get("sell_type", None)
      item = Item.objects.get(id=id)
      if item:
         serializer = ItemSerializer(item, context={'sell_type':sell_type})
         return JsonResponse(serializer.data, status = 200, safe=False)
      else:
         return JsonResponse({"data":False}, status = 400)

serializer.py

from rest_framework import serializers
from .models import Item

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

   class Meta:
      model = Item
      fields = ('entered_by', 'name', 'balance', 'sell_mode')
   
   def get_balance(self, object):
      sell_type = self.context.get("sell_type")
      if sell_type:
         return object.balance(sell_type)
      return object.balance

Ошибка, которую я получаю 'int' object is not callable

@property не может быть вызван. Поэтому я сделал переменную-член и методы сеттера (с вычислением) в модели Item, затем убедился, что метод сеттера будет вызван в методе сериализатора get_balance, непосредственно перед возвратом баланса.

Django ORM модель сама по себе является просто классом; вы можете делать все, что может делать класс, не связываясь с ORM.

Мой код:

models.py

from django.db import models
from django.contrib.auth.models import User

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

   _balance = 0

   def calculate_balance(self, stock_type='Retail'):
      stock = Stock.objects.filter(item=self, type=stock_type, status='InStock').aggregate(
          models.Sum('quantity')).get('quantity__sum')
      self._balance = stock or 0

   @property
   def balance(self):
      return self._balance

serializer.py

from django.contrib.auth.models import User
from rest_framework import serializers
from .models import Item


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

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

   def get_balance(self, object):
      sell_type = self.context.get("sell_type")
      if sell_type:
          object.calculate_balance(sell_type)
      return object.balance

views.py

from .models import Item
from .serializer import ItemSerializer
from django.http.response import JsonResponse

def getItemInfo(request):
    if request.is_ajax and request.method == "GET":
        id = request.GET.get("item_id", None)
        if id is None:
            return JsonResponse({"data": False}, status=400)
        sell_type = request.GET.get("sell_type", None)
        try:
            item = Item.objects.get(id=id)
            serializer = ItemSerializer(item, context={'sell_type': sell_type})
            return JsonResponse(serializer.data, status=200, safe=False)
        except Item.DoesNotExist:
            return JsonResponse({"data": False}, status=400)
Вернуться на верх