Django Rest Framework: позволяет создавать поле сериализатора, но не редактировать его - PullRequest
0 голосов
/ 28 октября 2018

Прямо сейчас аргумент DRF read_only в конструкторе Serializer означает, что вы не можете ни создавать, ни обновлять поле, в то время как аргумент write_only в конструкторе Serializer позволяет создавать поле ИЛИ обновлять, но предотвращаетполе из вывода при сериализации представления.

Есть ли какой-либо (элегантный) способ иметь поле Serializer, которое может быть создано ровно один раз, когда создается рассматриваемая модель (когда create() вызывается на Serializer), но не может быть позже изменен с помощью update?

NB : Да, я видел это решение ,но, честно говоря, я нахожу это уродливым и непифоническим.Есть ли лучший способ?

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Под "не элегантным" я предполагаю, что вам нужен только один сериализатор для создания и обновления.Вы можете переопределить метод update вашего сериализатора и удалить create_only_field из validated_data перед сохранением:

class MySerializer(serializers.ModelSerializer):

    def update(self, instance, validated_data):
        validated_data.pop('create_only_field')
        return super().update(instance, validated_data)

    class Meta:
        model = MyModel
        fields = ('id', 'field_one', 'field_two', 'create_only_field')

Однако вам придется предоставитьстарое (или некоторое) значение поля при обновлении модели.

0 голосов
/ 28 октября 2018
class TodoModifySerializer(ModelSerializer):

    def to_internal_value(self, data):
        data = super(TodoModifySerializer, self).to_internal_value(data)
        if self.instance:
            # update
            for x in self.create_only_fields:
                data.pop(x)
        return data

    class Meta:
        model = Todo
        fields = ('id', 'category', 'title', 'content')
        create_only_fields = ('title',)

Вы можете сделать это методом to_internal_value, удалив эти данные при обновлении

0 голосов
/ 28 октября 2018

Я не думаю, что они есть, вы либо указываете это так, либо создаете свой собственный сериализатор, унаследованный от сериализатора DRF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...