Прежде всего, вы должны установить user
в поле read_only
.Таким образом, вы не сможете изменить значение из API .Это можно сделать, указав read_only=True
в поле ИЛИ , добавив read_only_fields
в метакласс сериализатора.
class CustomerSerializer(serializers.ModelSerializer):
"""A Serizlier class for customer """
class Meta:
model = models.Customer
fields = ('user', 'first_name', 'last_name', 'dob', 'gender')
<b>read_only_fields = ('user',)</b>
Таким образом, DRF не будет принимать входные данные для поля user
из полезной нагрузки JSON, которую вы размещаете.
Тогда, как мы можем передать зарегистрированное пользовательское значение при Customer
создании экземпляра?
Я предполагаю, что вы используете ModelViewset
представление, чтобы оно прошло request
объект и view
объект для соответствующего сериализатора.В сериализаторе мы можем получить доступ к контекстным данным с помощью context
переменной класса сериализатора.
Итак, переопределить create()
метод CustomerSerializer
как показано ниже (я добавляю полный конфиг нижеприведенного сериализатора)
class CustomerSerializer(serializers.ModelSerializer):
"""A Serizlier class for customer """
class Meta:
model = models.Customer
fields = ('user', 'first_name', 'last_name', 'dob', 'gender')
<b>read_only_fields = ('user',) # added <<<<
def create(self, validated_data): # override this method <<<
"""
Since the 'user' is a read_only field, the validated data doesn't contain it.
"""
user = self.context['request'].user
validated_data['user'] = user
return super().create(validated_data)</b>