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
.
Чтобы обойти эту проблему, у вас есть два основных варианта:
Аргумент
source
вашего поля может ссылаться только на поля или свойства, существующие в вашей модели.Вытащите все поля, которые не являются частью модели, перед передачей в метод 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)