我们希望在django应用程序中强制执行特定的过滤器,以防止意外数据泄漏(并要求开发人员明确说明意图)。
假设我们有一个项目模型和一个图书模型,我们希望在不对项目进行过滤的情况下防止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
这样的东西有标准模式吗,还是反模式?
发布于 2022-07-06 03:39:09
有趣的问题!当然,您可以编写一个自定义管理器方法来创建像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
层中显式处理的(这很可能使用自定义管理器方法!)。但是,如果您处理的是标准视图,我认为这是可以接受的。
例如,在使用诸如Granted..throwing之类的通用工具时,在处理一些内置/快捷方式/插件时,.all()
上的错误可能会导致您不得不编写代码。
https://stackoverflow.com/questions/72882660
复制相似问题