如何使用tastypie按用户ID过滤对象?

时间:2012-03-27 06:42:22

标签: django 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匹配。但是接受的方式是什么?

2 个答案:

答案 0 :(得分: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 :(得分: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