Helpers - компьютеры, интернет, программирование

Пользовательские разрешения POST в Django rest framework

Используя DRF для настройки платформы, где пользователи могут обмениваться контентом, у меня возникают проблемы с проверкой того, совпадает ли автор с зарегистрированным пользователем.

Пример модели контента:

    class Post(models.Model):
        date = models.DateTimeField()
        author = models.ForeignKey(User)
        content = models.CharField(max_length=512)

Сериализатор контента:

    class PostSerializer(serializers.ModelSerializer):
        class Meta:
            model = Post

Просмотр содержимого:

    @authentication_classes((SessionAuthentication, BasicAuthentication,))
    @permission_classes((IsAuthenticated,))
    class PostViewSet(viewsets.ModelViewSet):
        queryset = Post.objects.all()
        serializer_class = PostSerializer
        http_method_names = ['get', 'post', 'head', 'options',]

Я хочу, чтобы почтовые запросы выполняли тест post.author == request.user перед сохранением сообщения.

С одной стороны, моя интуиция подсказывает мне, что я должен перезаписать метод создания представления таким кодом (не тестировался, но здесь я просто хочу дать представление о том, что я хочу сделать):

    class PostViewSet(viewsets.ModelViewSet):
        [...]
        def create(self, request):
            post = self.get_object()
            serializer = PostSerializer(data=request.data)
            if serializer.is_valid():
                if serializer.validated_data.author == request.user:
                    serializer.save()
                    return Response({'message': 'Post saved !'})
                else:
                    return Response({'message': 'You can't post for someone else'})
            else:
                return Response({'message': 'Not valid...'})

С другой стороны, когда я ищу подобные проблемы в своей любимой поисковой системе, я могу найти только ответы, которые включают перезапись методов создания/обновления в классе сериализатора.

Я не очень хорошо знаком ни с rest api, ни с DRF, но я запутался, потому что то, о чем я говорю, является своего рода пользовательским разрешением (разрешения обрабатываются в представлениях, верно?).

Ищу полезные советы :)


  • Пожалуйста, измените сообщение на POST в своем ответе, где вы имеете в виду метод HTTP. 20.09.2015

Ответы:


1

Создавать

Не имеет особого смысла оставлять поле author доступным для редактирования пользователю, а затем проверять его значение, вы можете просто установить его для пользователя в поле create. Итак, в вашем сериализаторе это будет:

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        read_only_fields = ('author',)

Затем в PostViewSet вместо вашего create:

def perform_create(self, serializer):
    serializer.save(author=self.request.user)

perform_create — это хук, который вызывается из create после проверки данных, поэтому вам не нужно беспокоиться об этом и создавать Response самостоятельно.

Обновить и удалить

Когда вы выполняете обновления или удаления, вы можете добавить собственный класс разрешений, например IsAuthorOrReadOnly, который проверяет, что post.author == request.user. Вы можете вдохновиться вторым примером здесь (IsOwnerOrReadOnly класс) который точно соответствует вашим потребностям.

Затем вы можете использовать его как любой другой класс разрешений, например:

@permission_classes((IsAuthenticated, IsAuthorOrReadOnly, ))
class PostViewSet(viewsets.ModelViewSet):
    # ...
20.09.2015
Новые материалы

Интуитивное понимание тензоров в машинном обучении
Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

Почему объяснимость так важна прямо сейчас?
По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

Анимированный математический анализ
Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

ИИ для чайников: руководство для начинающих по пониманию будущего технологий
Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..