Я использую 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
непосредственно в сериализатор работает как положено.