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)