В чем разница между Viewsets `create ()` и `update ()` и сериализаторами `create ()` и `update ()`?

Здесь: http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset говорится: «Класс ModelViewSet предоставляет следующие действия: .list (), .retrieve (), .create (), .update (), .partial_update () и .разрушать()."

Здесь: http://www.django-rest-framework.org/api-guide/serializers/#modelserializer говорится: «Класс ModelSerializer такой же, как и обычный класс Serializer, за исключением того, что: он включает простые реализации по умолчанию для .create () и .update ()».

1) Предполагая, что есть Viewset UserViewSet, маршрутизатор user и сериализатор UserSerializer. Если я отправил POST на /user/, вызывает ли он create() UserViewSet или create() UserSerializer?

2) Предположим, что UserViewSet имеет это разрешение:

class NoCreate(permissions.BasePermission):
    """
    No one can create this object.
    """
    message = 'You do not have permission to complete the action you are trying to perform.'

    def has_permission(self, request, view):
        if view.action == "create":
            return False
        return True

Вызывается ли create() UserSerializer, если я отправляю POST на /user/?


person SilentDev    schedule 06.03.2017    source источник


Ответы (2)


1) Предполагая, что существует Viewset UserViewSet и пользователь маршрутизатора и UserSerializer сериализатора. Если я отправил POST на / user /, вызовет ли он метод create () UserViewSet или create () UserSerializer?

Оба будут называться. Создание представления получит сериализатор, обеспечит правильность предоставленных данных, вызовет сохранение сериализатора и сгенерирует ответ. Команда create сериализатора фактически выполнит создание экземпляра, то есть запишет его в базу данных.

Создается ли UserSerializer create (), если я отправляю POST на / user /?

Нет, если разрешение установлено для набора просмотра. Однако, если вы хотите предотвратить любое создание, вам следует точно настроить свой ModelViewSet:

class UserViewSet(mixins.RetrieveModelMixin,
                  mixins.UpdateModelMixin,
                  mixins.DestroyModelMixin,
                  mixins.ListModelMixin,
                  GenericViewSet):

Будет содержать все действия, кроме создания.

person Linovia    schedule 06.03.2017

Методы .create() и .update() в ViewSets - это действия, которые выполняются при выполнении запроса. Запрос с POST методом вызывает .create() метод ViewSet, поскольку запрос с PUT методом или PATCH вызывает .update() метод ViewSet.

Методы .create() и .update() сериализатора выполняются путем вызова метода .save() сериализатора.

Вызов .save() либо создаст новый экземпляр, либо обновит существующий, в зависимости от того, был ли передан существующий экземпляр при создании экземпляра класса сериализатора:

# .save() will create a new instance.
serializer = CommentSerializer(data=data)

# .save() will update the existing `comment` instance.
serializer = CommentSerializer(comment, data=data)

Дополнительные сведения см. В документации по сохранению экземпляров.

person Hugo Brilhante    schedule 06.03.2017