Django Rest Framework при выполнении POST получает TypeError в Function.objects.create().

У меня есть следующая модель

class Funcion(models.Model):
    idPelicula = models.ForeignKey(Pelicula, on_delete=models.PROTECT)
    idSala = models.ForeignKey(Sala, on_delete=models.PROTECT)
    horaEntrada = models.TimeField(auto_now=False, auto_now_add=False)
    horaSalida = models.TimeField(auto_now=False, auto_now_add=False)
    fecha = models.DateField(auto_now=False)

И следующий сериализатор

class FuncionSerializer(serializers.ModelSerializer):
    pelicula = PeliculaSerializer(read_only=True)
    idPelicula = serializers.PrimaryKeyRelatedField(write_only=True, queryset=Pelicula.objects.all(), source='pelicula')
    sala = SalaSerializer(read_only=True)
    idSala = serializers.PrimaryKeyRelatedField(write_only=True, queryset=Sala.objects.all(), source='sala')

    class Meta:
        model = Funcion
        fields = '__all__'

Когда я пытаюсь разместить новый Funcion с помощью Django api root я получаю следующую ошибку:

TypeError at /funcion/

Got a `TypeError` when calling `Funcion.objects.create()`. This may be because you have a writable field on the serializer class that is not a valid argument to `Funcion.objects.create()`. You may need to make the field read-only, or override the FuncionSerializer.create() method to handle this correctly.

Я использовал этот метод раньше для других проектных практик, и он работал правильно.

Если я удаляю аргумент source='pelicula' для PrimaryKeyRelatedField(), он публикует новую функцию, но когда я делаю get, чтобы принести все данные, он не показывает поле Pelicula или Sala, только остальное

Я попробовал удалить эти аргументы, потому что ошибка в конце показывает это сообщение TypeError: Funcion() got unexpected keyword arguments: 'pelicula', 'sala'

Метод create менеджера модели не допускает "неожиданных" полей. Эти поля не являются свойствами или полями данной модели.

К сожалению, насколько я понимаю код, поле проскальзывает через функции построения поля и попадает в словарь validated_data. Вероятно, это происходит потому, что каждое поле read_only разрешено, поскольку оно все равно будет отфильтровано, прежде чем достигнет validated_data, но source прохождение поля read_only проходит. Я не думаю, что это ожидается, но все же не причиняет вреда, поскольку метод create менеджера модели вызывает ошибку TypeError.

Чтобы обойти эту проблему, у вас есть два основных варианта:

  1. Аргумент source вашего поля может ссылаться только на поля или свойства, существующие в вашей модели.

  2. Вытащите все поля, которые не являются частью модели, перед передачей в метод create модели.

Последний вариант будет выглядеть примерно так:

class CoolSerializer(serializers.ModelSerializer):
    not_cool = serializers.CharField(max_length=42)

    def create(self, validated_data):
        cool_again = validated_data.pop('not_cool', None)
        # Do something with cool_again that you originally intended to do.
        return super().create(validated_data)
Вернуться на верх