“”类型的对象在 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 响应。