create(self, validated_data)
для добавления любых дополнительных деталей в объект прежде, чем сохранить И значения "напоминания" в каждое образцовое поле точно так же, как **validated_data
делает. Идеально разговор, Вы хотите сделать эту форму "подталкивания" только в ОДНО местоположение так create
, метод в Вашем CommentSerializer
является лучшим местом. Вдобавок к этому Вы могли бы хотеть также назвать внешнюю пчелу для создания учетных записей пользователей на их стороне прежде, чем сохранить учетные записи в собственную базу данных. Необходимо использовать этот 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
класс, который является родителем [1 111]. 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
, функция заботится о вызове проверки на Вашем сериализаторе и создания корректного ответа. Красота позади этого, то, что можно теперь изолировать прикладную логику и НЕ интересоваться о приземленных и повторяющихся вызовах проверки и выводе ответа обработки :). Это работает вполне хорошо в conjuction с эти create(self, validated_data)
найденный в сериализаторе (где Ваша определенная прикладная логика могла бы находиться).
perform_create(self, serializer)
функция со всего одной строкой кода!?!? Ну, главная причина позади этого состоит в том, чтобы позволить customizeability при вызове эти save
функция. Вы могли бы хотеть снабдить дополнительными данными прежде, чем звонить save
(как [1 118] и если бы мы не имели perform_create(self, serializer)
, то необходимо было бы переопределить create(self, request, *args, **kwargs)
, и это просто побеждает цель наличия mixins выполнение тяжелого и растачивания. Hope это помогает!