我们的应用将用户模型中的is_active
字段设置为False
以表示已删除的用户
从每次访问用户表中排除已删除用户(where is_active=False
)的最佳做法是什么?
请考虑以下事项:
1.该应用程序已经编写,因此我们会尽可能地了解最小代码更改
2.该应用使用:request.user
,get_object_or_404()
,当然还有User.objects
,因此解决方案必须考虑所有这些因素。
从我所做的研究中,我发现:
1.代理模型:会迫使我在代码中做出很多改动;我不知道它如何与request
和get_object_or_404()
一起使用
2. contribute_to_class
:是否可以用它来覆盖objects
经理或仅添加新经理?安全吗?
3.中间件变化:我不想进入这个。对我来说太冒险了。
这样做有一种优雅的方式吗?
答案 0 :(得分:1)
没有办法做到这一点,你也不应该尝试。将每个操作限制为选择的模型实例的唯一方法是限制默认查询集,然后有效地孤立被排除的实例,无法再次访问它们。 Django docs明确警告此行为。
如果覆盖
get_query_set()
方法并过滤掉任何行,Django将返回不正确的结果。不要那样做。 过滤get_query_set()
结果的管理员不适合用作自动管理员。 (强调我的)
“自动”管理器与默认管理器基本相同。它是用于相关领域的,用于Django管理员,以及Django机器的无数其他领域。如果限制默认管理器,则会限制所有内容。
现在,还有其他选项可以快速访问有限的查询集;它们根本不是“自动的”,这意味着你仍然必须注意使用它们,而不仅仅是让一切都通过魔法发生。但是,“魔术”在这方面违反了核心Python租户之一:显式优于隐式。默认情况下限制User
查询集是一个隐式操作。手动过滤查询集,引用自定义管理器方法或使用User
的子类都是明确的操作,因此更可取。