Django और DRF के लिए नया, मेरे पास मॉडल गुणों में एक विधि है जो तर्क स्वीकार करती है। मैं इसे सफल कहने में कामयाब रहा हूं, हालांकि डिफ़ॉल्ट पैरामेंटर्स के साथ एक धारावाहिक वर्ग और JSON प्रतिक्रिया प्राप्त कर रहा है। मेरी समस्या यह है कि मैं बैलेंस नामक उस फ़ंक्शन पर तर्क पारित नहीं कर सकता। मैंने अपने तर्क को धारावाहिक वर्ग से देखने में सफल रहा है लेकिन धारावाहिक से मॉडल तक जहां मैं असफल रहा हूं। मुझे लगा कि सराहना की जाएगी।

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

View.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' ऑब्जेक्ट कॉल करने योग्य नहीं है

0
Martian4x 9 सितंबर 2021, 03:06
1
आप @property को args नहीं भेज सकते
 – 
Reza Heydari
9 सितंबर 2021, 05:01
@RezaHeydari, मैंने अभी यह सीखा है, इसे इंगित करने के लिए धन्यवाद। :)
 – 
Martian4x
9 सितंबर 2021, 11:58

1 उत्तर

सबसे बढ़िया उत्तर

@property को कॉल नहीं किया जा सका। इसलिए मैंने आइटम मॉडल में सदस्य चर और सेटर (गणना के साथ) विधियों को बनाया है, फिर सुनिश्चित करें कि सेटर विधि को get_balance सीरिएलाइज़र विधि में बुलाया जाएगा, शेष राशि वापस करने से पहले।

Django ORM मॉडल ही सिर्फ एक वर्ग है; आप कुछ भी कर सकते हैं, न केवल ओआरएम से जुड़ना।

मेरा कोड:

Model.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

View.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)
1
jiho lee 9 सितंबर 2021, 13:15