Ответ
Метод 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()
.