Django Rest Framework ModelSerializer Установить атрибут при создании
Первоначально при создании объекта я использую вошедшего в систему пользователя, чтобы назначить поле модели «владелец».
Модель:
class Account(models.Model):
id = models.AutoField(primary_key=True)
owner = models.ForeignKey(User)
name = models.CharField(max_length=32, unique=True)
description = models.CharField(max_length=250, blank=True)
Сериализатор для установки владельца:
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = models.Account
fields = ('name', 'description')
def restore_object(self, attrs, instance=None):
instance = super().restore_object(attrs, instance)
request = self.context.get('request', None)
setattr(instance, 'owner', request.user)
return instance
Другой пользователь в моей системе может обновить объект учетной записи другого пользователя, но право владения должно оставаться за первоначальным пользователем. Очевидно, что вышеперечисленное нарушает это, поскольку право собственности перезаписывается при обновлении текущего пользователя, вошедшего в систему.
Итак, я обновил это так:
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = models.Account
fields = ('name', 'description')
def restore_object(self, attrs, instance=None):
new_instance = False
if not instance:
new_instance = True
instance = super().restore_object(attrs, instance)
# Only set the owner if this is a new instance
if new_instance:
request = self.context.get('request', None)
setattr(instance, 'owner', request.user)
return instance
Это рекомендуемый способ сделать что-то подобное? Я не вижу другого пути, но у меня пока очень ограниченный опыт.
Спасибо
Из рассмотрения ответа @ zaphod100.10. В качестве альтернативы, в коде представления (с удаленным пользовательским методом restore_object в указанном выше сериализаторе):
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.DATA, files=request.FILES)
if serializer.is_valid():
serializer.object.owner = request.user
self.pre_save(serializer.object)
self.object = serializer.save(force_insert=True)
self.post_save(self.object, created=True)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED,
headers=headers)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)