是否有可能在django中基于变量强制管理器过滤器?



我们希望在django应用程序中强制执行一个特定的过滤器,以防止意外的数据泄漏(并要求开发人员明确意图)。

假设我们有一个Project模型和一个Book模型,我们想要在不过滤项目的情况下防止Book.objects.all()

我想要这样的东西:

Book.objects.for_project(project) -> Should return a QuerySet with all books for a specific project
Book.objects.all_projects() -> Should return a QuerySet with all books, i.e. for usage in data migration commands
Book.objects.all_projects().filter() -> Should be chainable
Book.objects.all() -> Should throw a DataLeakError()
Book.objects.filter() -> Should throw a DataLeakError()
Book.objects.exclude() -> Should throw a DataLeakError()
Book.objects.only() -> Should throw a DataLeakError()
....etc

对于这样的东西是否有标准模式,或者这是一个反模式?

有趣的问题!您当然可以编写一个自定义管理器方法来创建像all_projects()这样的方法,并为给定的方法引发错误。

class Book(models.Model):
objects = BookManager()

或者您可以提供一个辅助对象管理器,如

class Book(models.Model):
permission_objects = BookManager()

如果有一个实例需要避免这个过滤器集,它仍然允许你通过ORM获取所有数据。

class BookManager(models.Manager):
def for_project(proj):
return self.filter(project=proj)

对于这样的事情是否存在标准模式,或者这是一个反模式?

我认为这取决于你的应用程序。使用自定义管理器方法当然不是反模式。在Django Rest框架中,这通常在permissions层中显式处理(它可以很好地使用自定义管理器方法!)但是,如果你处理的是标准视图,我认为这是可以接受的。

理所当然. .抛出错误的东西,如.all()可能会导致头痛,你必须编码周围处理一些内置/快捷键/插件,如果你使用通用的东西,如ViewSets,例如。

最新更新