Как сделать поле редактируемым = False в DRF - PullRequest
0 голосов
/ 07 октября 2018

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

class ABCSerializer(serializers.ModelSerializer):
    class Meta:
        """Meta."""

        model = ModelA
        fields = ('colA', 'colB', 'colC',)

colA - обязательное поле при создании объекта.Тем не менее, не должно быть разрешено обновить.Как я могу это сделать ??

Ответы [ 3 ]

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

Похоже, вам нужны разные сериализаторы для PUT и POST методов.В сериализаторе для метода PUT вы можете установить для поля colA значение readonly

class ABCViewSet(ModelViewSet):
    serializer_class = ABCSerializer

    def get_serializer_class(self):
        serializer_class = self.serializer_class
        if self.request.method == 'PUT':
            serializer_class = SerializerWithReadOnlyColA
        return serializer_class
0 голосов
/ 07 октября 2018

Вы можете переопределить метод update сериализатора, чтобы обновлять только те поля, которые вам нужны.

class ABCSerializer(serializers.ModelSerializer):
    def update(self, instance, validated_data):
        instance.colB = validated_data.get('colB', instance.colB)
        instance.colC = validated_data.get('colC', instance.colC)
        # do nothing to instance.colA
        instance.save()
        return instance

    class Meta:
        model = ModelA
        fields = ('colA', 'colB', 'colC',)

Или, если у вас много полей, и вы просто хотите пропустить обновление colA, вы можете написать свойupdate метод, подобный следующему:

def update(self, instance, validated_data):
    validated_data.pop('colA') # validated_data no longer has colA
    return super().update(instance, validated_data)

Подробнее о переопределении update можно прочитать здесь: https://www.django -rest-framework.org / api-guide / serializers / # save-instances

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

Вы можете сделать это с помощью опции read_only_fields

class ABCSerializer(serializers.ModelSerializer):
    class Meta:
        """Meta."""

        model = ModelA
        fields = ('colB', 'colC',)
        read_only_fields = ('colA',)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...