Django передает поле из сериализатора в model.save(), которого нет в модели

Мне нужно передать в метод сохранения модели поля, которые присутствуют в сериализаторе, но не присутствуют в модели (у меня сложная логика сохранения и я хочу принимать некоторые решения при создании объекта на основе этих полей). Как я могу это сделать? Я пытался добавить non_db_field = property в модель, но все равно получаю ошибку MyModel() got an unexpected keyword argument 'negative_amount'

Допустим, моя модель

class MyModel(AbstractModel):
    field1 = models.DateTimeField()
    field2 = models.BigIntegerField()

Мой сериализатор является

class MyModelSerializer(AbstractSerializer):
    field3 = serializers.BooleanField(required=False)

    class Meta(AbstractSerializer.Meta):
        model = MyModel
        fields = '__all__'

А мой набор представлений -

class MyModelViewSet(AbstractViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

Вы должны обработать это поведение в методе serializer.save, например, вы можете вывести его из validated_data вот так:

    def save(self, **kwargs):
        self.validated_data.pop("negative_amount")

        return super().save(**kwargs)

Вы можете использовать fields=['field1', 'field2', 'field3'] в сериализаторе вместо fields='__all__'.

Я нашел решение, частично основанное на ответе Шарпека и частично на этом ответе:

В serializer я переопределяю save метод:

    def save(self, **kwargs):
        if 'field3' in self.validated_data:
            kwargs['field3'] = self.validated_data.pop('field3')
        return super().save(**kwargs)

В модели я переопределяю метод init и определяю поле:

    field3 = None
    def __init__(self, *args, **kwargs):
        if 'field3' in kwargs:
            self.field3 = kwargs.pop('field3')
        super(Reading, self).__init__(*args, **kwargs)
Вернуться на верх