1

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

从我所做的研究中,我发现:
1. 代理模型:会迫使我对代码进行大量更改;我不知道它如何与requestand一起使用get_object_or_404()
2. contribute_to_class: 可以用来覆盖objects管理器还是只添加一个新的?安全吗?
3. 中间件更改:我不想涉及这个。对我来说太冒险了。

有没有一种优雅的方式来做到这一点?

4

1 回答 1

1

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

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

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

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

于 2012-07-05T14:56:52.263 回答