Tengo este código en Django usando el marco REST. Aquí están mis modelos, serializador, vistas:
modelo:
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)serializador:
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 instancevista:
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)Recibo este mensaje de error:
TypeError en /api/v1/reservations/ El objeto de tipo Car no es JSON serializable
Solo necesito PrimaryKey of Cars; por eso uso PrimaryKeyRelatedField.
¿Cómo puedo resolver este error?
Debe devolver serializer.data en lugar de serializer.validated_data .
Eche un vistazo al código actualizado para 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) la propiedad data está destinada a traducir la instancia del modelo al tipo de diccionario nativo de Python. Python Dictionary se puede serializar como una respuesta JSON.