Когда вызывается метод `create` в сериализаторе Django REST Framework?

Ответ

Метод create() в сериализаторе Django REST Framework (DRF) вызывается, когда вы сохраняете новый объект через serializer.save() и сериализатор был инициализирован без существующего экземпляра (instance=None или не передан).

Назначение: Этот метод предназначен для реализации пользовательской логики создания объекта, которая выходит за рамки простого сохранения полей модели. Например:

  • Создание связанных объектов.
  • Выполнение дополнительных действий после создания (отправка уведомлений).
  • Хеширование паролей или другая обработка данных перед сохранением.

Метод create() принимает один аргумент: validated_data (словарь проверенных данных) и должен вернуть созданный экземпляр модели.

Пример: Предположим, нам нужно создать пользователя с хешированным паролем, используя метод create_user модели User.

from rest_framework import serializers
from django.contrib.auth.models import User # Пример модели пользователя

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username', 'email', 'password']
        extra_kwargs = {'password': {'write_only': True}} # Пароль только для записи

    def create(self, validated_data):
        # Извлекаем пароль, чтобы передать его в create_user
        password = validated_data.pop('password', None)
        user = User.objects.create_user(**validated_data)
        if password:
            user.set_password(password) # Хешируем и устанавливаем пароль
            user.save()
        return user

# Использование в представлении (например, для POST-запроса):
# from rest_framework.response import Response
# from rest_framework import status
# serializer = UserSerializer(data=request.data)
# if serializer.is_valid():
#     user = serializer.save() # Здесь будет вызван метод create()
#     return Response(user.username, status=status.HTTP_201_CREATED)

Важно: Если сериализатор инициализирован с существующим объектом (serializer = UserSerializer(instance=user, data=...)), то при вызове serializer.save() вместо create() будет вызван метод update().