根据用户登录Django app过滤数据

时间:2011-05-01 08:11:57

标签: django tdd filtering

我有一个适合我的Django应用程序,但目前没有用户的概念:我是唯一一个使用它的人,我想改变这个......

除管理员视图外,登录用户不应访问其他用户创建的数据。用户之间没有共享数据。

  • 我想我必须为我创建的所有模型添加user外键。正确?

  • 是否有一种基于request.user实现过滤的简单方法?这可以或多或少地自动完成,或者我是否必须通过所有代码来检查在数据库上完成的每个查询?

  • 我已经使用TDD编写了代码,我打算跟进...确保正确实现用户过滤的最佳策略是什么?我没有忘记过滤现有的查询?我想我可以编写测试来表明特定查询尚未过滤,并实现过滤器。但是我稍后会写的查询呢?有没有办法可以断言所有现有和将来的查询都返回仅属于当前用户的对象?

感谢。

1 个答案:

答案 0 :(得分:2)

是的,您需要添加用户FK。不要忘记您必须手动或通过South等工具迁移数据库表。

实现过滤器的一种方法是为模型定义自定义管理器,使用for_user方法将用户作为参数:类似于:

class ForUserManager(models.Manager):
    def for_user(self, user):
        return self.filter(user=user)

现在,您可以在所有模型上使用此管理器 - 子类化和/或使用mixin - 并记住在任何地方都使用objects.for_user(request.user)

这将使测试更容易 - 你的测试可以monkeypatch for_user方法,以便它在某个地方的全局变量中设置一个标志或一个计数器,然后测试它是否按预期递增。

编辑以回复评论不,如您所怀,这不起作用。甚至不是每个人都必须获得最后登录的用户:管理员是类级属性,因此在整个过程中重复使用,因此该服务器进程提供的任何请求都将使用相同的。