我有一个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
:必须先呈现响应内容才能访问它。
我有办法在返回之前检查对象吗?我必须找到解决方法吗?
答案 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