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为您所做的所有逻辑,这样就永远不会使用序列化程序;您正在将位置对象直接传递到
与其这样做,不如从模型实例对象实例化序列化程序,然后将该序列化程序数据传递给响应,就像在
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) |