【发布时间】:2020-02-09 15:04:56
【问题描述】:
我在所有模型中添加了is_active 字段以添加软删除功能,并添加了用于获取活动对象的自定义管理器
class SoftDeleteManager(models.Manager):
def get_queryset(self):
return super(SoftDeleteManager, self).get_queryset().filter(is_active=True)
class Student(models.Model):
is_active = models.BooleanField(default=True)
active_objects = SoftDeleteManager()
objects = models.Manager()
此外,我还想在 auth.User 模型上添加相同的 active_objects 管理器,但由于此模型未在我的代码库中定义,我不知道如何继续。
【问题讨论】:
-
您应该使用自定义用户模型,即使您不更改模型的任何字段。请参阅here 了解如何执行此操作。希望这不是生产中的应用程序,您仍然可以从自定义用户模型重新开始(在项目中更改用户模型很复杂)。对于其他 3rd 方应用程序,您始终可以子类化模型以将
is_active字段添加到模型并更改默认管理器或添加额外的管理器。 -
请注意,您必须小心“重用”
User模型的is_active字段来指示软删除。在某些情况下,is_active是False,直到用户验证他们的电子邮件地址。或者用户可能由于可疑活动而被暂停,这也是is_active可能被设置为False的地方。因此,将其解释为“已删除”可能不是您想要的。 -
@dirkgroten 谢谢,但我正在寻找一个通用的解决方案来向任何 3rd 方应用程序添加自定义管理器。上面的用例只是一个例子。
-
好吧,
User是一个特例,所以它不是第 3 方应用程序的一个很好的例子。对于任何其他模型,只需 subclass it,如果它没有is_active字段(因为您需要添加带有该字段的表)或者如果模型已经有is_active字段,请使用 proxy model。