Объект типа '' не является JSON-сериализуемым в DRF
У меня есть этот код на Django с использованием фреймворка REST. Вот мои модели, сериализатор, представления:
модель:
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)
serializer:
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
view:
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)
Я получаю следующее сообщение об ошибке:
TypeError at /api/v1/reservations/ Объект типа Car не является JSON сериализуемым
Мне нужен только PrimaryKey автомобиля; поэтому я использую PrimaryKeyRelatedField.
Как я могу устранить эту ошибку?
Вам нужно вернуть 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 Response.