2015-10-15 41 views
3

我是一個Django初學者(儘管我在使用Sails.js + Angular的Web開發方面有經驗),所以請耐心等待。Django:過濾請求的結果,只包含與請求用戶相關的數據

我有一個現有的應用程序,它使用REST API在Sails.js後端和AngularJS前端之間進行通信。現在,我們發現後端不適合我們的用途,我們將在不久的將來換用Django。 Sails.js會自動爲控制器創建REST方法,而Django不會,所以我想我將使用Django Rest Framework之類的東西來創建API。

所以是的,我發現了大多數事情的相應功能。我還沒有找到的東西是Sails.js特性的替代品,稱爲「策略」。它們是可以在某些控制器動作的查詢上執行的功能,可以定義爲模型特定的,模型控制器特定的動作以及特定的請求類型。例如,您可以有一個「authAccess」策略,用於檢查請求的用戶是否已通過身份驗證,並且在實際請求的控制器方法執行之前執行該策略。您也可以在將請求對象傳遞給控制器​​之前使用它們來修改請求對象。現在我實際的問題:

比方說,我有一個具有與其他模型中的許多一對一關係的User模型,我們稱之爲Book,這就意味着用戶可以擁有很多書,但一本書只能有一個所有者。 Goody很好。現在,我們有一個正在查詢查找他所有書籍的登錄用戶。他向/book發出GET請求。我想確保返回的Book對象被過濾,以便只返回他的書。

因此,基本上在Sails中,我能夠編寫一個策略,將請求參數更改爲{user: loggedInUser},從而自動篩選結果Book結果。這很方便,因爲我可以使用相同的策略來過濾其他模型,例如DVDFriend或其他。我的問題是 - 什麼是在Django中實現相同功能的最佳方式?

回答

2

看一看文檔: http://www.django-rest-framework.org/api-guide/filtering/#filtering-against-the-current-user

最有可能你最好覆蓋在模型視圖集中的get_queryset方法。

from rest_framework import generics, viewsets, mixins, generics 


class OwnerModelViewSet(viewsets.ModelViewSet): 

    def get_queryset(self): 
     """ 
     This view should return a list of all the records 
     for the currently authenticated user. 
     """ 
     return self.model.objects.filter(user=self.request.user) 

所有模型視圖集中的類可以從該類繼承:你可以通過創建你的意見一個基類,喜歡的事,使之成爲一個通用的辦法。這將需要外鍵字段始終被命名爲「用戶」。如果情況並非如此,那麼如何找到用戶表的外鍵字段是一種有點詭計的方式。小心使用。

from django.db.models.fields.related import ForeignKey 
from accounts.models import User 

def _get_related_user(self, obj): 
    ''' 
    Search for FK to user model and return field name or False if no FK. 
    This can lead to wrong results when the model has more than one user FK. 
    ''' 
    for f in self.model._meta.fields: 
     if isinstance(f, ForeignKey) and f.rel.to == User: 
      return f.name 
    return False