Как в Django REST Framework создать или обновить экземпляр модели из валидированного сериализатора?

«Как в Django REST Framework создать или обновить экземпляр модели из валидированного сериализатора?» — вопрос из категории Django, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Django REST Framework для создания или обновления экземпляра модели из данных сериализатора используется метод .save().

Этот метод можно вызывать только после успешной валидации данных с помощью serializer.is_valid().

Как работает .save():

В зависимости от того, как был инициализирован сериализатор, .save() вызывает один из двух методов:

  • .create(validated_data) — если сериализатор был создан только с data (создание нового объекта).
  • .update(instance, validated_data) — если сериализатор был создан с instance и data (обновление существующего объекта).

Пример создания (Create):

# request.data = {'name': 'New Product', 'price': 150.0}
serializer = ProductSerializer(data=request.data)
if serializer.is_valid():
    # Вызывает ProductSerializer.create()
    new_product = serializer.save()
    # new_product - это созданный экземпляр модели Product

Пример обновления (Update):

product_instance = Product.objects.get(pk=1)
# request.data = {'price': 200.0}
serializer = ProductSerializer(instance=product_instance, data=request.data, partial=True)
if serializer.is_valid():
    # Вызывает ProductSerializer.update()
    updated_product = serializer.save()
    # updated_product - это обновленный экземпляр

Метод .save() также может принимать дополнительные аргументы, которые будут переданы в .create() или .update(). Это полезно для установки полей, которые не приходят от клиента, например, owner:

serializer.save(owner=request.user)