django rest framework error while post through json data

here is my models.py

from __future__ import unicode_literals
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=200)
    company_name = models.ForeignKey('Company',on_delete=models.CASCADE,related_name='user')

    def __str__(self):
        return self.name

class Company(models.Model):
    name = models.CharField(max_length=200)
    phone_number = models.IntegerField(null=True,blank=True)

    def __str__(self):
        return self.name

class Catalog(models.Model):
    name = models.CharField(max_length=200)
    no_of_pcs = models.IntegerField(null=True,blank=True)
    per_piece_price = models.DecimalField(null=True,blank=True,max_digits=10,decimal_places=2)
    company_name = models.ForeignKey(Company,on_delete=models.CASCADE,related_name='catalog')

    def __str__(self):
        return self.name

Here is my serializers.py

from rest_framework import serializers
from .models import *
from django.db.models import Sum,Count

class CatalogSerializerPost(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField(required=False, allow_blank=True, max_length=100)
    no_of_pcs = serializers.IntegerField()
    per_piece_price = serializers.IntegerField()

    def create(self, validated_data):
        return Catalog.objects.create(**validated_data)

class CatalogSerializer(serializers.ModelSerializer):
    total_pieces = serializers.SerializerMethodField()
    total_price  = serializers.SerializerMethodField()
    class Meta:
        model = Catalog
        fields = ('name','no_of_pcs','per_piece_price','company_name','total_pieces','total_price')
        depth = 1

    def get_total_pieces(self, obj):
        totalpieces = Catalog.objects.aggregate(total_pieces=Count('no_of_pcs'))
        return totalpieces["total_pieces"]

    def get_total_price(self, obj):
        totalprice = Catalog.objects.aggregate(total_price=Sum('per_piece_price'))
        return totalprice["total_price"]

here is my views.py

from __future__ import unicode_literals
from django.http import HttpResponse
from .models import *
import json
from django.http import JsonResponse, HttpResponse
from .serializers import *
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import viewsets, generics
from rest_framework.decorators import api_view


@api_view(['GET', 'POST'])
def CatalogView(request):
    if request.method == 'GET':
        catalogs = Catalog.objects.select_related('company_name')
        serializer = CatalogSerializer(catalogs, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = CatalogSerializerPost(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Here is my urls.py

from django.conf.urls import url, include
from django.contrib import admin

from api.views import CatalogView
from api import views
from rest_framework.urlpatterns import format_suffix_patterns
from rest_framework import routers

router = routers.DefaultRouter()
# router.register('catalogs',views.CatalogView,'catalog')
router.register('companies',views.CompanyView)
router.register('users',views.UserView)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', include(router.urls)),
    url(r'catalog/', CatalogView),
]

Here i am not able to post data THRIUGH JSON DATA..

Please refer the screenshot for the error.. Thanks..scrren shot

here is the screen shot for error please check this issue.

Here i am not able to post data THROUGH JSON DATA.. showing id field is required.

Upvotes: 0

Views: 417

Answers (2)

Exprator
Exprator

Reputation: 27533

there are few problems with your Serializer and View both, and also the data that you are passing, Change your serializer to this

class CatalogSerializerPost(serializers.Serializer):
    name = serializers.CharField(required=False, allow_blank=True, max_length=100)
    no_of_pcs = serializers.IntegerField()
    per_piece_price = serializers.IntegerField()
    company_name_id = serializers.IntegerField() # add this field as you have a company field in the Catalog Model. and you are passing company id in the JSON.


    def create(self, validated_data):
        return Catalog.objects.create(**validated_data)

and pass

"company_name_id" :3 in your json

Upvotes: 1

neverwalkaloner
neverwalkaloner

Reputation: 47374

You need to mark id field as read only:

class CatalogSerializerPost(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)

Also it could be more simple to use ModelSerializer.

Upvotes: 1

Related Questions