python - 如何防止添加到抽象模型中的管理器成为默认管理器?
问题描述
我们经常将soft_deleted
字段添加到我们的模型中,以便将它们标记为已删除而不实际删除它们,以防用户/我们犯了错误并且我们想要撤消它,以及出于其他记录保存原因。
我想通过添加一个带有该字段的抽象模型类和一个管理器来获取未删除的对象(以及其他一些不相关的方法)来共同化这一点:
from django.db.models import Manager, Model
class UndeletedObjectsManager(Manager):
def get_queryset(self):
return self.model._default_manager.filter(soft_deleted=False)
class SoftDeletableModel(Model):
class Meta:
abstract = True
soft_deleted = BooleanField(default=False)
undeleted_objects = UndeletedObjectsManager()
但是,当我使用它时,根据我认为 MRO 顺序,有时undeleted_objects
管理器最终成为默认管理器,而不是objects
在另一个抽象模型类上定义,这意味着例如反向多对多管理器无法正常工作(他们过滤soft_deleted
)。
我知道我可以设置default_manager_name
所有子类模型,但这会重复很多次并且会破坏重构的部分要点。
有没有其他方法可以防止这种情况发生,并保证undeleted_objects
不会被选为默认经理?
解决方案
Django 将它在模型上找到的第一个管理器实例解释为默认管理器,因此请尝试:
class SoftDeletableModel(Model):
class Meta:
abstract = True
soft_deleted = BooleanField(default=False)
objects = models.Manager()
undeleted_objects = UndeletedObjectsManager()
推荐阅读
- python - How to extract a table from any file using python?
- html - 变换 scaleX 并保持固定的正确位置
- docker - How does kubectl logs -f affect CPU and RAM usage?
- node.js - Taiko UI 自动化角度 - 无法使用 fileField 上传 csv 文件
- android - Android perform a task when CPU is asleep
- android - Create a auto fill chat message view in android
- swift - 如何从 SwiftUI2 App 条目中获取 NSView
- javascript - 将模型列表属性值分配给 MVC 视图中的变量
- php - Generate Range in used PHP and Skip already
- javascript - How to use proxys with the electron BrowserWindow function