Пользовательский миксин Django REST Framework не работает - PullRequest
0 голосов
/ 02 июля 2019

Я использую Django 2.2 и Django REST framework .

В сериализаторе я хочу иметь несколько полей только для создания экземпляра, а не для обновления. Значит, пользователь не сможет изменить значение этого поля после его создания.

Поскольку Django не предоставляет никакого способа сделать это по умолчанию. Я пишу миксин, который при использовании будет использовать create_only_fields из сериализатора Meta для удаления полей из данных запроса с помощью запроса PUT / PATCH .

serializer_mixin.py

class CreateOnlyFieldsMixin(object):

    def to_internal_value(self, data):
        data = super().to_internal_value(data)
        print(data)
        if self.instance:
            # Update request
            print(data)
            for x in self.Meta.create_only_fields:
                if x in data:
                    data.pop(x)

        return data

и использование в сериализаторе как

class MySerializer(CreateOnlyFieldsMixin, serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = [
            'id',
            'name',
            'value'
        ]
        create_only_fields = ['name']

Но теперь, вызывая любую конечную точку, выдает ошибку

Cannot call `.is_valid()` as no `data=` keyword argument was passed when instantiating the serializer instance.

Установка CreateOnlyFieldsMixin после serializers.ModelSerializer не дает ошибок, но не оказывает влияния на миксин.

Добавление to_internal_value непосредственно в сериализатор работает как положено.

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