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

标签 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 匹配。但公认的方式是什么?

最佳答案

我不确定我在这里提出的建议是否能在您的授权下发挥作用。它使用 ApiKeyAuthorization 和 Authorization 对我有用。

我从以下地方读到了这个想法: http://django-tastypie.readthedocs.org/en/latest/cookbook.html [部分:创建每用户资源]

我的建议是:

取消注释身份验证和授权,并覆盖 obj_create 和 apply_authorization 怎么样。我在我的项目中使用它,并且它有效。在方法 apply_authorization 的代码中,我刚刚添加了对 super 用户的 if 条件检查,您可以直接返回 object_list+filter 而不进行检查(我这样做是因为 if 不是 super 用户,我返回与用户组相关的数据)。

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',''))

希望就是您所要求的,它会有所帮助。 最好用那个!

关于django - 如何使用 tastypie 按用户 ID 过滤对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9884529/

相关文章:

javascript - js 向 django 传递参数

python - 不是 Django 中 @atomic() 的嵌套版本?

python - Tastypie:包括相关模型的计算字段?

django - 如何在 Tastypie API 中创建对象?

django - 我如何从 Tastypie JSON 访问 Backbone 集合元素?

django - 如何在 django-tastypie 中使用 full=True 限制 ToManyField 中的字段

python django 关闭 excel 服务器

django - 如何在 Django Rest Framework 的 get 方法中序列化查询集?

python - 添加 css 样式后 Django formwizard 中断 django-material

django - 如何使用 TastyPie PATCH 更新密码