我有一个Django模型,其中包含对应用程序功能核心的设置。您不应该删除此模型。我正在尝试在整个应用程序中执行此操作。我已经在管理界面中禁用了删除功能,并且还禁用了该模型上的删除方法,但是QuerySet有它自己的删除方法。例如:
MyModel.objects.all()[0].delete() # Overridden, does nothing
MyModel.objects.all().delete() # POOF!
讽刺的是,Django文档对于为什么delete()是QuerySet的方法而不是Manager的方法有以下说法:
这是一种安全机制,防止您意外请求Entry.objects.delete()并删除所有条目。
必须包含.all()是一种“安全机制”的说法可谓站不住脚。相反,这实际上创建了一个后门,不能通过常规手段(覆盖管理器)关闭。
有人知道如何在像QuerySet这样核心的东西上覆盖此方法,而不需要对源代码进行Monkey Patching吗?
get_queryset(self)
。 - Andrei-Niculae Petreobjects = MyQuerySet.as_manager()
。 - mgalgsdef get_queryset(self): return MyQuerySet(model=self.model, using=self._db, hints=self._hints)
。 - Mark Chackerian