【问题标题】:Django REST: ContentNotRenderedError when checking JSON object before renderingDjango REST:在渲染前检查 JSON 对象时出现 ContentNotRenderedError
【发布时间】:2014-07-11 16:23:45
【问题描述】:

我有一个 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必须先呈现响应内容,然后才能访问它。

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

【问题讨论】:

  • 在此处查看“自定义权限”:django-rest-framework.org/api-guide/permissions
  • 我想你说的是 django-rest-framework...如果是,请将其添加到标签中。
  • 好的,谢谢!而且我一直在研究自定义权限,但不确定这是否是最好的方法,因为所需要的只是简单的身份检查。
  • 您使用的是标准 REST 资源吗?您必须覆盖的是 get_object() 而不是 get()
  • 我可能会以任何一种方式做到这一点——get()delete() 等都调用get_object()。但我仍然需要能够在返回之前访问该对象的字段。

标签: json django django-rest-framework


【解决方案1】:

一种可能的解决方法是重新定义get_queryset(),而不是get()get_object()get_queryset() 是返回相关模型的所有对象的函数;考虑到pk 的论点,get_object() 缩小了这些范围。

通过覆盖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

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 2020-11-11
    • 2020-12-23
    • 2016-02-28
    • 2012-12-12
    • 2016-04-14
    • 2012-06-25
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多