Python 在通过json数据进行post时出现django rest框架错误

Python 在通过json数据进行post时出现django rest框架错误,python,django,Python,Django,这是我的模特 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 _

这是我的模特

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
这是我的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"]
这是我的观点

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)
这是我的URL.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),
]
在这里,我无法将数据发布到JSON数据中

有关错误,请参阅屏幕截图。。 谢谢

这是错误的屏幕截图 请检查这个问题

在这里,我无法通过JSON数据发布数据。。
显示id字段是必需的。

您需要将
id
字段标记为只读:

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

此外,它还可以更简单地使用。

您需要将
id
字段标记为只读:

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

此外,它还可以更简单地使用。

您的序列化程序几乎没有问题,请同时查看这两个问题,以及您正在传递的数据,将序列化程序更改为

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)
并通过

"company_name_id" :3 in your json

您的序列化程序和视图几乎没有问题,而且您正在传递的数据也没有问题,请将序列化程序更改为

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)
并通过

"company_name_id" :3 in your json

IntegrityError at/catalog/(1048,“company_name_id”列不能为空)IntegrityError at/catalog/(1048,“company_name_id”列不能为空){“id”:[“此字段是必需的。”]}是否已从序列化程序中删除id字段?请检查编辑的ans@kiranyoutubechannel,不必保留id字段,从序列化程序{“id”:[“此字段是必需的。”]}是否从序列化程序中删除了id字段?检查编辑的ans@kiranyoutubechannel,不必保留id字段,从序列化程序中删除它