Django Rest Framework: как сделать поле обязательным / доступным только для чтения для действий обновления, таких как PUT и PATCH? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть сериализатор Django, в котором есть поле, которое необходимо заполнять только для действий обновления, таких как PUT и PATCH.Но не для действий по созданию, таких как POST.

Я нашел этот похожий вопрос SO , но нет никакого понятия о том, как написать пользовательскую проверку, чтобы определить, предназначено ли действие для создания или обновления илиpatch.

Точно так же я хочу включить read_only (или сделать их недоступными для редактирования) для некоторых других полей, но только для действий обновления.

Я погуглил django rest framework docs, но естьнет явных примеров таких пользовательских валидаторов.

В настоящее время мой обходной путь должен установить required=false в целом, что не является лучшим.

Пожалуйста, сообщите.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Что я делаю в таких ситуациях, так это имею другой сериализатор, который наследуется от базового сериализатора и переопределяет соответствующие поля.Так что в вашем случае такой подход должен работать:

class CreateSerializer(serializers.Serializers):
    field = serializers.CharField(max_length=100)

class UpdateSerializer(CreateSerializer):
    field = serializers.CharField(max_length=100, required=False)

И, на ваш взгляд, верните соответствующий сериализатор:

def get_serializer_class(self):
    if self.request.action == "POST":
        return CreateSerializer
    elif self.request.action in ["PUT", "PATCH"]:
        return UpdateSerializer

Я думаю, что это хороший подход, потому чтовам может понадобиться добавить дополнительную логику в будущем на основе метода запроса.Это также более читабельно, чем обезьяна, исправляющая атрибут required поля.

0 голосов
/ 12 декабря 2018

Вы можете переопределить get_fields методы serializer, а затем вы можете изменить значение этих полей

class SomeDataSerializer(serializers.ModelSerializer):
    some_field = serializers.CharField(max_length=100)

    def get_fields(self, *args, **kwargs):
        fields = super(SomeDataSerializer, self).get_fields(*args, **kwargs)
        request = self.context.get('request', None)
        if request and getattr(request, 'method', None) == "POST":
            fields['some_field'].required = False
        return fields
...