Django auth_user - 排除非活动用户的最佳做法

时间:2012-07-05 12:54:30

标签: django django-authentication django-managers

我们的应用将用户模型中的is_active字段设置为False以表示已删除的用户 从每次访问用户表中排除已删除用户(where is_active=False)的最佳做法是什么?
请考虑以下事项:
1.该应用程序已经编写,因此我们会尽可能地了解最小代码更改 2.该应用使用:request.userget_object_or_404(),当然还有User.objects,因此解决方案必须考虑所有这些因素。

从我所做的研究中,我发现:
1.代理模型:会迫使我在代码中做出很多改动;我不知道它如何与requestget_object_or_404()一起使用 2. contribute_to_class:是否可以用它来覆盖objects经理或仅添加新经理?安全吗? 3.中间件变化:我不想进入这个。对我来说太冒险了。

这样做有一种优雅的方式吗?

1 个答案:

答案 0 :(得分:1)

没有办法做到这一点,你也不应该尝试。将每个操作限制为选择的模型实例的唯一方法是限制默认查询集,然后有效地孤立被排除的实例,无法再次访问它们。 Django docs明确警告此行为。

  

如果覆盖get_query_set()方法并过滤掉任何行,Django将返回不正确的结果。不要那样做。 过滤get_query_set()结果的管理员不适合用作自动管理员。 (强调我的)

“自动”管理器与默认管理器基本相同。它是用于相关领域的,用于Django管理员,以及Django机器的无数其他领域。如果限制默认管理器,则会限制所有内容。

现在,还有其他选项可以快速访问有限的查询集;它们根本不是“自动的”,这意味着你仍然必须注意使用它们,而不仅仅是让一切都通过魔法发生。但是,“魔术”在这方面违反了核心Python租户之一:显式优于隐式。默认情况下限制User查询集是一个隐式操作。手动过滤查询集,引用自定义管理器方法或使用User的子类都是明确的操作,因此更可取。