关于python:类型’A’的对象不是JSON可序列化的

Object of type 'A' is not JSON serializable

本问题已经有最佳答案,请猛点这里访问。

我有下面的get或create方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class LocationView(views.APIView):
    def get_or_create(self, request):
        try:
            location = Location.objects.get(country=request.data.get("country"), city=request.data.get("city"))
            print(location)
            return Response(location, status=status.HTTP_200_OK)
        except Location.DoesNotExist:
            serializer = LocationSerializer(data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def get(self, request):
        return self.get_or_create(request)

    def post(self, request):
        return self.get_or_create(request)

这对于创建一个新位置很有用,但是,如果位置存在,我会得到以下错误:

1
2
TypeError: Object of type 'Location' is not JSON serializable
[16/Mar/2018 10:10:08]"POST /api/v1/bouncer/location/ HTTP/1.1" 500 96971

这是我的模型序列化程序,

1
2
3
4
5
6
class LocationSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)

    class Meta:
        model = models.Location
        fields = ('id', 'country', 'city', 'longitude', 'latitude')

我在这里做错什么了


出于某种原因,您已经绕过了DRF为您所做的所有逻辑,这样就永远不会使用序列化程序;您正在将位置对象直接传递到try块中的JSON响应。

与其这样做,不如从模型实例对象实例化序列化程序,然后将该序列化程序数据传递给响应,就像在except块中那样。


JSON转储仅适用于基本类型(str、int、float、bool、none)。您正试图转储一个不可"转储"的对象。将对象转换为字典,例如:

1
2
3
4
5
6
7
8
location_dict = {
    'id': location.id,
    'country': location.country,
    'city': location.city,
    'longitude': location.longitude,
    'latitude': location.latitude
}
return Response(location_dict, status=status.HTTP_200_OK)