Ответ 1
- Вы должны использовать
create(self, validated_data)
чтобы добавить любые дополнительные детали в объект перед сохранением значений И "prod" в каждое поле модели, как это делает**validated_data
. В идеале, вы хотите делать эту форму "подталкивания" только в ОДНОМ месте, поэтому методcreate
в вашемCommentSerializer
- лучшее место. Кроме того, вы можете также вызвать внешний apis для создания учетных записей пользователей на их стороне непосредственно перед сохранением ваших учетных записей в вашей собственной базе данных. Вы должны использовать эту функциюcreate
вместе сModelViewSet
. Всегда думай - "Тонкие взгляды, Толстые сериализаторы".
Пример:
def create(self, validated_data):
email = validated.data.get("email", None)
validated.pop("email")
# Now you have a clean valid email
# You might want to call an external API or modify another table
# (eg. keep track of number of accounts registered.) or even
# make changes to the email format.
# Once you are done, create the instance with the validated data
return models.YourModel.objects.create(email=email, **validated_data)
-
Функция
create(self, request, *args, **kwargs)
вModelViewSet
определяется в классеCreateModelMixin
который является родителемModelViewSet
. Основные функцииCreateModelMixin
в:from rest_framework import status from rest_framework.response import Response def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) def perform_create(self, serializer): serializer.save()
Как вы можете видеть, вышеупомянутая функция create
заботится о вызове проверки вашего сериализатора и получении правильного ответа. Прелесть этого в том, что теперь вы можете изолировать логику своего приложения и НЕ беспокоиться о повседневных и повторяющихся вызовах проверки и обработки вывода ответов :). Это работает довольно хорошо в сочетании с create(self, validated_data)
найденным в сериализаторе (где может находиться логика вашего конкретного приложения).
- Теперь вы можете спросить, почему у нас есть отдельная
perform_create(self, serializer)
с одной строкой кода!?!? Ну, главная причина этого заключается в том, чтобы позволить настраиваемость при вызове функцииsave
. Возможно, вы захотите предоставить дополнительные данные перед вызовомsave
(например,serializer.save(owner=self.request.user)
и если у нас не былоperform_create(self, serializer)
, вам придется переопределитьcreate(self, request, *args, **kwargs)
и это только побуждает миксинов выполнять тяжелую и скучную работу.
Надеюсь это поможет!