Search code examples
djangodjango-modelsdjango-rest-frameworkdjango-viewsdjango-serializer

Why the payload is not valid. serializers.ModelSerializer | Where is problem ? | Django | views


I was writing the api for booking section.
I am trying to make a management ptoject. The registration have feilds and i have to make rest api. When I am passing values from postman it is showing these error
Models.py

 class BookingRegister(models.Model):
    STATUS = [('Booked','Booked'), ('InTransit','InTransit'), ('AtDestination','AtDestination'), ('Delivered','Delivered'), ('Return','Return')]
    PAYMENT_TYPE = [('Paid','Paid'), ('ToPay','ToPay'), ('ToBeBilled','ToBeBilled')]
    TRANSPORT_MODE = [('AIR','AIR'), ('ROAD','ROAD'), ('WATER','WATER')]
    PACKAGE_TYPE = [('TIN','TIN'), ('BOX','BOX'), ('BUNDLE','BUNDLE'), ('CARTOON','CARTOON')]
    TAX_PERCENTAGES = [(5,'5%'), (8,'8%'), (10,'10%'), (15,'15%'), (18,'18%')]
    RATE_AS_PER = [('QTY','QTY'), ('WT','WT')]
    id = models.AutoField(primary_key=True)
    #bookingDetails=models.OneToOneField(BookingRegisterDetails, on_delete=models.CASCADE)
    status = models.CharField(max_length=15, choices=STATUS)
    paymentType = models.CharField(max_length=10, choices=PAYMENT_TYPE)
    consignor = models.ForeignKey(Party, on_delete=models.CASCADE, related_name='consignor')
    consignee = models.ForeignKey(Party, on_delete=models.CASCADE, related_name='consignee')
    origin = models.ForeignKey(City, on_delete=models.CASCADE, related_name='origin')
    destination = models.ForeignKey(City, on_delete=models.CASCADE, related_name='destination')
    bookingPoint = models.ForeignKey(Branch, on_delete=models.CASCADE, related_name='bookingPoint')
    deliveryPoint = models.ForeignKey(Branch, on_delete=models.CASCADE, related_name='deliveryPoint')
    bookingDate = models.DateField()
    transportMode = models.CharField(choices=TRANSPORT_MODE, default='ROAD', max_length=15)
    createdTime = models.DateTimeField(editable=False, default=datetime.now)
    updatedTime = models.DateTimeField(editable=False, default=datetime.now)

    packageType = models.CharField(choices=PACKAGE_TYPE, default='CARTOON', max_length=15)
    itemName = models.CharField(max_length=30)
    quantity = models.IntegerField()
    actualWeight = models.FloatField(default=0)
    grossWeight = models.FloatField(default=actualWeight)
    taxPercentage = models.IntegerField(choices=TAX_PERCENTAGES)
    rateAsPer = models.CharField(choices=RATE_AS_PER, max_length=5)
    rate = models.FloatField()
    serviceCharge = models.FloatField(default=0)
    bookingCharge = models.FloatField(default=0)
    loadingCharge = models.FloatField(default=0)
    unloadingCharge = models.FloatField(default=0)
    total = models.FloatField(default=0)
    def __str__(self) -> str:
        return str(self.id)+" "+self.status+" "+self.paymentType+" "+self.consignor+" "+self.consignee <br>

views.py

class BookingRegisterAPI(APIView):
    def get(self, request, id=None, format=None):
        if id:
            try:
                booking=BookingRegister.objects.get(pk=id)
                #bookingDetails=BookingRegisterDetails.objects.select_related(bookingId=id)
                serializer = TransportSerializer.BookingRegisterSerializer(booking)
                return Response(serializer.data)
            except:
                return Response("No record found", status=status.HTTP_404_NOT_FOUND)

def post(self, request, id=None, format=None):

    serializer=TransportSerializer.BookingRegisterSerializer(data=request.data)
    print(serializer.build_unknown_field)
    try:
        print("go")
        
        if serializer.is_valid():
            print("val")
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response("Not valid")
    except:
        return Response("Please enter valid data", status=status.HTTP_208_ALREADY_REPORTED)
            

Serialiser.py

class TransportSerializer:
class BranchSerializer(serializers.ModelSerializer):
    class Meta:
        model=Branch
        fields=['id', 'name', 'cityId']

class PartySerializer(serializers.ModelSerializer):
    class Meta:
        model=Party
        fields=['id', 'firstName', 'lastName', 'cityId', 'adhaar']

class BookingRegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model=BookingRegister
        fields=['id', 'status', 'paymentType','consignor', 'consignee', 
                'origin', 'destination', 'bookingPoint', 'deliveryPoint', 'bookingDate', 
                'packageType', 'itemName', 'quantity', 'actualWeight', 'grossWeight',
                'taxPercentage', 'rateAsPer', 'rate', 'serviceCharge', 'bookingCharge', 
                'loadingCharge', 'unloadingCharge','total']

My postman payload

{
"status": "Booked",
"paymentType":"Paid",
"consignor":1, 
"consignee":2, 
"origin":1, 
"destination":2, 
"bookingPoint":4,
"deliveryPoint":5, 
"bookingDate":"21/08/2022",
"packageType":"BOX", 
"itemName":"Medicine", 
"quantity":5, 
"actualWeight":"50", 
"grossWeight":50,
"taxPercentage":"5%", 
"rateAsPer":"QTY", 
"rate":10, 
"serviceCharge":0, 
"bookingCharge":0, 
"loadingCharge":0, 
"unloadingCharge":0,
"total":50

}

I dont know where i am making mistake. Can anyone please help me in this.


Solution

  • There was error in payload. We can simply check the error while serializer by -> print(serializer.error_messages)