“”类型的对象在 DRF 中 JSON 不可序列化
Object of type '' is not JSON serializable in DRF
我在使用 REST 框架的 Django 中有这段代码。这是我的模型、序列化器、视图:
型号:
class Car(AbstractTimeTrackable, models.Model):
production_type = models.ForeignKey(
'cars.CarProductionType',
on_delete=models.PROTECT,
related_name='cars',
verbose_name=_('production_type')
)
warehouse = models.ForeignKey(
'warehouses.Warehouse',
on_delete=models.SET_NULL,
verbose_name=_('warehouse'),
related_name='cars',
blank=True,
null=True,
)
class Meta:
verbose_name = _('Auto')
verbose_name_plural = _('Auto')
def __str__(self):
return str(self.id)
class Reservation(AbstractTimeTrackable, models.Model):
is_active = models.BooleanField(
default=False,
verbose_name=_('is_active')
)
cars = models.ManyToManyField(
'cars.Car',
verbose_name=_('ID cars')
)
class Meta:
verbose_name = _('Reservation')
verbose_name_plural = _('Reservation')
def __str__(self):
return str(self.id)
序列化器:
class ReservationSerializer(serializers.ModelSerializer):
days_count = serializers.IntegerField(required=True)
cars = serializers.PrimaryKeyRelatedField(queryset=Car.objects.all(), many=True)
class Meta:
model = Reservation
fields = [
'id',
'is_active',
'cars'
]
extra_kwargs = {
'id': {'read_only': True}
}
def create(self, validated_data):
cars = validated_data.pop('cars')
instance = super().create(validated_data)
if cars:
instance.cars.add(*cars)
return instance
查看:
class ReservationViewSet(CreateModelMixin, GenericViewSet):
serializer_class = ReservationSerializer
queryset = Reservation.objects.all()
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(status=status.HTTP_201_CREATED, data=serializer.validated_data)
我收到此错误消息:
类型错误 /api/v1/reservations/
Car 类型的对象不是 JSON 可序列化的
我只需要Cars的PrimaryKey;这就是我使用 PrimaryKeyRelatedField 的原因。
我该如何解决这个错误?
您需要 return serializer.data
而不是 serializer.validated_data
。
查看 ReservationViewSet
的更新代码:
class ReservationViewSet(CreateModelMixin, GenericViewSet):
serializer_class = ReservationSerializer
queryset = Reservation.objects.all()
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(status=status.HTTP_201_CREATED, data=serializer.data)
data
属性 旨在将模型实例转换为 Python 本机字典类型。 Python 字典可以序列化为 JSON 响应。
我在使用 REST 框架的 Django 中有这段代码。这是我的模型、序列化器、视图:
型号:
class Car(AbstractTimeTrackable, models.Model):
production_type = models.ForeignKey(
'cars.CarProductionType',
on_delete=models.PROTECT,
related_name='cars',
verbose_name=_('production_type')
)
warehouse = models.ForeignKey(
'warehouses.Warehouse',
on_delete=models.SET_NULL,
verbose_name=_('warehouse'),
related_name='cars',
blank=True,
null=True,
)
class Meta:
verbose_name = _('Auto')
verbose_name_plural = _('Auto')
def __str__(self):
return str(self.id)
class Reservation(AbstractTimeTrackable, models.Model):
is_active = models.BooleanField(
default=False,
verbose_name=_('is_active')
)
cars = models.ManyToManyField(
'cars.Car',
verbose_name=_('ID cars')
)
class Meta:
verbose_name = _('Reservation')
verbose_name_plural = _('Reservation')
def __str__(self):
return str(self.id)
序列化器:
class ReservationSerializer(serializers.ModelSerializer):
days_count = serializers.IntegerField(required=True)
cars = serializers.PrimaryKeyRelatedField(queryset=Car.objects.all(), many=True)
class Meta:
model = Reservation
fields = [
'id',
'is_active',
'cars'
]
extra_kwargs = {
'id': {'read_only': True}
}
def create(self, validated_data):
cars = validated_data.pop('cars')
instance = super().create(validated_data)
if cars:
instance.cars.add(*cars)
return instance
查看:
class ReservationViewSet(CreateModelMixin, GenericViewSet):
serializer_class = ReservationSerializer
queryset = Reservation.objects.all()
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(status=status.HTTP_201_CREATED, data=serializer.validated_data)
我收到此错误消息:
类型错误 /api/v1/reservations/ Car 类型的对象不是 JSON 可序列化的
我只需要Cars的PrimaryKey;这就是我使用 PrimaryKeyRelatedField 的原因。
我该如何解决这个错误?
您需要 return serializer.data
而不是 serializer.validated_data
。
查看 ReservationViewSet
的更新代码:
class ReservationViewSet(CreateModelMixin, GenericViewSet):
serializer_class = ReservationSerializer
queryset = Reservation.objects.all()
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(status=status.HTTP_201_CREATED, data=serializer.data)
data
属性 旨在将模型实例转换为 Python 本机字典类型。 Python 字典可以序列化为 JSON 响应。