【发布时间】: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