Django REST:在渲染之前检查JSON对象时的ContentNotRenderedError

时间:2014-07-11 16:23:45

标签: json django django-rest-framework

我有一个Django模型Note,它有一个基于类的视图。它应该在适当的查询时返回一个JSON对象。

然而,在返回对象之前,我想检查note对象中的user字段是否与当前登录的用户匹配。(用户不应该能够访问不属于他们的Note对象。 )为此,我尝试重写get()方法,在返回之前调用self.retrieve()检查对象:

class NoteDetail(generics.RetrieveUpdateDestroyAPIView):
    model = Note
    serializer_class = NoteSerializer
    permission_classes = (permissions.IsAuthenticated,)
    renderer_classes = (JSONRenderer,)

    def get(self, request, *args, **kwargs):
        current_user = User.objects.get(pk=self.request.user.id)
        note = self.retrieve(request, *args, **kwargs)

        if note.author is current_user:
            return note
        else:
            raise PermissionDenied('Note does not belong to authenticated user.')(author=current_user)

但是,这会在运行时返回ContentNotRenderedError必须先呈现响应内容才能访问它。

我有办法在返回之前检查对象吗?我必须找到解决方法吗?

1 个答案:

答案 0 :(得分:0)

一种可能的解决方法是重新定义get_queryset(),而不是get()get_object()get_queryset()是返回相关模型的所有对象的函数;鉴于get_object()论证,pk在这些中缩小了。

通过覆盖get_queryset(),您可以限制get_object()可以选择的潜在对象。因此,在调用get()时已经过滤了该集合。

def get_queryset(self):
    current_user = User.objects.get(pk=self.request.user.id)

    # Must filter by author to prevent making everyone's notes public
    queryset = Note.objects.filter(author=current_user)

    return queryset