2012-03-27 74 views
3

我有以下的用戶資源:如何用tastypie按用戶標識過濾對象?

class UserResource(ModelResource): 
    class Meta: 
    queryset = User.objects.all() 
    resource_name = 'user' 
    fields = ['username', 'first_name', 'last_name'] 
    allowed_methods = ['get'] 
    filtering = { 
     'username': ALL, 
     'id': ALL, 
    } 

和下面的模型資源:

class GoalResource(ModelResource): 
    user = fields.ForeignKey(UserResource, 'user') 

    class Meta: 
    #authentication = BasicAuthentication() 
    #authorization = ReadOnlyAuthorization() 
    queryset = Goal.objects.all() 
    resource_name = 'goal' 
    filtering = { 
     'user': ALL_WITH_RELATIONS, 
    } 

我希望能夠過濾通過用戶ID而不是用戶名的目標。

我可以做這個GET請求獲得來自某些用戶名目標清單:

http://localhost:8000/api/v1/goal/?user__username=test 

但我希望能夠通過用戶ID而不是進行排序:

http://localhost:8000/api/v1/goal/?user__id=1 

如何我會得到第二部分的工作?

另外,通過Javascript訪問當前登錄用戶的id的一般過程是什麼?我正在使用backbonejs,我想爲所有登錄用戶的目標發佈帖子。我想過在頁面上放置一個隱藏的字段和用戶的ID。然後從DOM中提取隱藏字段的值,但我認爲使用chrome的開發人員工具可以隨時更改id。當然,我將使用身份驗證來檢查登錄用戶的ID是否與我從隱藏字段中提取的ID匹配。但接受的方式是什麼?

+0

按照user_id進行排序或過濾? – ashwoods 2012-03-28 07:39:28

+0

這似乎很奇怪,你不包括在用戶字段中的編號 – 2012-07-31 12:11:40

回答

4

我不確定我在這裏提出的建議是否可以在您的授權中使用。它適用於我使用ApiKeyAuthorization和授權。

我讀了這個想法: http://django-tastypie.readthedocs.org/en/latest/cookbook.html [小節:創建每個用戶的資源]

我的建議是:

怎麼樣取消註釋身份驗證和授權,和壓倒一切的obj_create和apply_authorization。我在我的項目中使用它,並且它工作。在方法apply_authorization的代碼中,我只是添加了if條件檢查超級用戶,您可以直接返回object_list +過濾器而不檢查(如果不是超級用戶,則返回與用戶組相關的數據)。

class GoalResource(ModelResource): 
    user = fields.ForeignKey(UserResource, 'user') 

    class Meta: 
    authentication = BasicAuthentication() 
    authorization = ReadOnlyAuthorization() 
    queryset = Goal.objects.all() 
    resource_name = 'goal' 
    filtering = { 
     'user': ALL_WITH_RELATIONS, 
    } 

    def obj_create(self, bundle, request=None, **kwargs): 
     return super(EnvironmentResource, self).obj_create(bundle, request, user=request.user) 


    def apply_authorization_limits(self, request, object_list): 
     if request.user.is_superuser: 
      return object_list.filter(user__id=request.GET.get('user__id','')) 

希望就是你在問什麼,它有幫助。 最好的!

1

注 - 不建議使用apply_authorization_limits。

當前用戶過濾的替代方法是覆蓋您授權類中的read_list。這是我的。我的類重寫DjangoAuthorization。

def read_list(self, object_list, bundle): 
    klass = self.base_checks(bundle.request, object_list.model) 

    if klass is False: 
     return [] 

    # GET-style methods are always allowed. 

    # Filter by user 
    if not hasattr(bundle.request, 'user'): 
     return None 

    object_list = object_list.filter(user__id=bundle.request.user.id) 

    return object_list 
+0

它實際上已被棄用,但它在文檔中的任何地方都使用它。我勒個去? – kamelkev 2013-07-21 02:33:36

+0

它似乎不被棄用。 http://django-tastypie.readthedocs.org/en/latest/resources.html – eugene 2013-12-13 09:23:54

+0

它已被棄用,如果你看看[源代碼](https://github.com/django-tastypie/django-tastypie/blob/master /tastypie/resources.py#L1079) – miraculixx 2015-11-08 17:21:12