62
задан 13 July 2019 в 18:41

1 ответ

  1. Вы использовали бы 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)
  1. Эти 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) найденный в сериализаторе (где Ваша определенная прикладная логика могла бы находиться).

  1. Теперь Вы могли бы спросить, почему делают у нас есть отдельное perform_create(self, serializer) функция со всего одной строкой кода!?!? Ну, главная причина позади этого состоит в том, чтобы позволить customizeability при вызове эти save функция. Вы могли бы хотеть снабдить дополнительными данными прежде, чем звонить save (как [1 118] и если бы мы не имели perform_create(self, serializer), то необходимо было бы переопределить create(self, request, *args, **kwargs), и это просто побеждает цель наличия mixins выполнение тяжелого и растачивания.

Hope это помогает!

82
ответ дан 31 October 2019 в 14:20

Другие вопросы по тегам:

Похожие вопросы: