2015-04-25 5 views
7

Я хочу, чтобы request.user мог только выдать запрос POST для создания темы форума, в которой они являются авторами. С PUT и DELETE я могу добиться этого, используя has_object_permission, но с POST я не могу этого сделать, я предполагаю, что объект еще не создан.Разрешение на уровне объекта Django Rest Framework на POST

class TopicPermission(IsAuthenticatedOrReadOnly): 
    """ 
    Any user should be able to read topics but only authenticated 
    users should be able to create new topics. An owner or moderator 
    should be able to update a discussion or delete. 
    """ 
    def has_object_permission(self, request, view, obj): 
     if request.method in SAFE_METHODS: 
      return True 

     # Instance must have an attribute named `author` or moderator 
     return obj.author == request.user or request.user.forum_moderator 

Как бы идти о проверке request.user == obj.author в запросах POST?

+1

У вас есть 'author' поле на вашем сериализаторе, что вы пытаетесь обеспечить установлен для текущего пользователя, когда перехлест объект? Есть более эффективные способы сделать это, чем выполнить проверку разрешения. –

+0

да, это не об этом. Он отлично работает для PUT и DELETE, но с POST has_object_permission не работает. – awwester

+1

Под «не работает» вы имеете в виду, что «не называется», «вызывает ошибку» или «никогда не проходит»? Непонятно, что вы пытаетесь сделать в своем вопросе, и это [пахнет проблемой XY] (http://meta.stackexchange.com/q/66377/159034). –

ответ

3

я в конечном итоге делаю проверку в режиме просмотра вместо сериализатора:

class TopicViewSet(viewsets.ModelViewSet): 
    permission_classes = (TopicPermission,) 
    queryset = Topic.objects.all() 
    serializer_class = TopicSerializer 

    def create(self, request, *args, **kwargs): 
     """ 
     verify that the POST has the request user as the obj.author 
     """ 
     if request.data["author"] == str(request.user.id): 
      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=201, headers=headers) 
     else: 
      return Response(status=403) 
Смежные вопросы