Я пишу сериализатор для моей модели, доступ к которому осуществляется с помощью конечных точек GET, POST и PATCH. У меня есть свойство в моей модели, которое я использую в качестве источника для поля. Однако использование source=
в поле сериализатора делает его только готовым.
Если я удалю source="get_field1"
из
field1 = serializers.NullBooleanField(source="get_field1")
тогда я могу обновить данные.
Но я ДОЛЖЕН использовать источник, чтобы получить правильное значение поля.
class MyModel(models.Model):
field1 = NullBooleanField(default=None)
@property
get_field1(self):
data = True
# ...some logic
return data
Теперь у меня есть сериализатор, который я использую
class MyModelSerializer(serializers.ModelSerializer):
field1 = serializers.NullBooleanField(source="get_field1")
class Meta:
model = MyModel
fields = ('field1')
Теперь в моей конечной точке API я делаю это
serializer = MyModelSerializer(my_model, data=request.data, partial=True)
if serializer.is_valid():
serializer.save() # <- throws error "can't set attribute"
Также хотелось бы отметить, что поле в сериализаторе указывается по имени свойства, а не по имени поля.
Пример: если я сделаю
>> serializer.validated_data
>> 'OrderedDict(['get_field1'], True) # <- shouldn't this by field1 and not get_field1