2014-07-11 61 views
0

我有一個Django模型,Note,它有一個基於類的視圖。它應該在適當的查詢上返回一個JSON對象。Django REST:在呈現之前檢查JSON對象時ContentNotRenderedError

但是,在返回對象之前,我想檢查註釋對象中的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

看看「自定義權限」在這裏:http://www.django-rest-framework.org/api-guide/permissions –

+0

我想你是講Django的休息框架的...如果是,將其添加到標籤。 –

+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 
相關問題