首页 > 解决方案 > 输入请求时输入错误 Django Rest Framework

问题描述

我正在构建一个 Django 应用程序,其中有一个名为 Location 的模型和另一个名为 Property 的模型。每当我尝试发出 put 请求时,它都会显示我的类型错误TypeError: Object of type Location is not JSON serializable

我的位置模型

class Location(models.Model):
     lat = models.DecimalField(max_digits=10,decimal_places=8)
     long = models.DecimalField(max_digits=10,decimal_places=8)
     address = models.CharField(max_length=256)
class Property(models.Model):
     owner = models.OneToOneField(to=User,on_delete=models.CASCADE)
     name = models.CharField(max_length=256)
     bedrooms = models.SmallPositiveIntigerField()
     bathrooms = models.SmallPositiveIntigerField()
     living_rooms = models.SmallPositiveIntigerField()
     location = models.ForeignKey(to=Location,null=True,on_delete=models.SETNULL)

串行器

class PropertySerializer(serializers.ModelSerializer):
     class Meta:
          model = Property
          fields = ['id','name','bedrooms','bathrooms','living_rooms','location']
          read_only_fields = ['id']

class LocationSerializer(serializers.ModelSerializer):
     class Meta:
          model = Location
          fields = ['id','long','lat','address']
          read_only_fields = ['id']

意见

class RenterCreate(APIView):
    
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated, RenterPermission]
    renderer_classes = [JSONRenderer]

    
    def get(self, request):
        
        property = Property.objects.all()
        serializer = RenterSerializer(property , many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

    
    def post(self, request):
        serializer = PropertySerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(user=request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.error_messages, status=status.HTTP_400_BAD_REQUEST)

    def put(self, request):
        serializer = PropertySerializer(request.user, data=request.data)
        if serializer.is_valid():
            serializer.save(user=request.user)
            return Response(serializer.data)
        
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

当我使用 PUT 请求更新它向我显示的信息时保存属性后,我 TypeError: Object of type Location is not JSON serializable 在数据库中保存了几个位置。首先我用它发出了一个帖子请求,它给了我STATUS 201 CREATED

{
'name': 'foo',
'bedrooms':4,
'bathrooms':3,
'living_rooms':5,
'location':4,
}

然后我对它做一个 put 请求

{
'name': 'foo bar',
'bedrooms':1,
'bathrooms':2,
'living_rooms':2,
'location':1,
}

它给了我TypeError: Object of type Location is not JSON serializable

标签: pythondjangodjango-rest-frameworkdjango-serializerserialization

解决方案


在您的“位置”属性中,PropertySerializer您需要添加一个PrimaryKeyRelatedField或:LocationSerializer

class PropertySerializer(serializers.ModelSerializer):
     location = PrimaryKeyRelatedField()
     class Meta:
          model = Property
          fields = ['id','name','bedrooms','bathrooms','living_rooms','location']
          read_only_fields = ['id']

或者:

class PropertySerializer(serializers.ModelSerializer):
     location = LocationSerializer()
     class Meta:
          model = Property
          fields = ['id','name','bedrooms','bathrooms','living_rooms','location']
          read_only_fields = ['id']

我相信在 RenterCreate 视图中也有一种方法可以做到这一点,但如果其中任何一个先工作,请告诉我。


推荐阅读