Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何将自定义管理器添加到第三方应用程序&x27;s模型_Django_Django Managers - Fatal编程技术网

Django 如何将自定义管理器添加到第三方应用程序&x27;s模型

Django 如何将自定义管理器添加到第三方应用程序&x27;s模型,django,django-managers,Django,Django Managers,我在所有型号中都添加了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

我在所有型号中都添加了
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_对象
manager,但由于此模型未在我的代码库中定义,我不确定如何继续。假设:您想软删除没有
is_active
字段的任何第三方模型。它不应该是
auth.User
模型,因为这是一个特例

我首先创建一个抽象模型类来实现软删除行为:

class SoftDeleteModel(models.Model):
    is_active = models.BooleanField(default=True)

    active_objects = SoftDeleteManager()
    objects = models.Manager()

    class Meta:
        abstract = True
现在,假设您有一个第三方应用程序,其型号为
消息
,那么在您的应用程序中,您可以将其子类化:

from 3rdparty.models import Message as ExtMessage
from .models import SoftDeleteModel

class Message(SoftDeleteModel, ExtMessage):
    pass

现在,您自己的
消息
类具有额外字段和
活动对象
管理器。您需要
makemigrations
migrate
,因为将为
Message

创建一个新表。您应该使用自定义用户模型,即使您不更改模型的任何字段。请参阅以了解如何做到这一点。希望这不是一个正在生产的应用程序,您仍然可以重新开始定制用户模型(在项目中期更改用户模型很复杂)。对于其他第三方应用程序,您始终可以对模型进行子分类,以将
处于活动状态
字段添加到模型中,并更改默认管理器或添加其他管理器。请注意,您必须小心地“重新使用”
用户
模型的
处于活动状态
字段,以指示软删除。在某些情况下,
处于活动状态
False
,直到用户验证其电子邮件地址。或者用户可能由于可疑活动而被暂停,这也是
处于活动状态的地方
可能被设置为
False
。因此,将其解释为“已删除”可能不是您想要的。@dirkgroten谢谢,但我正在寻找一种通用解决方案,以向任何第三方应用程序添加自定义管理器。上面的用例只是一个例子。
User
是一个特例,所以它不是第三方应用的好例子。对于任何其他模型,只要它没有
is_active
字段(因为需要添加一个带有该字段的表),或者模型已经有
is_active
字段,使用。您的解决方案看起来不错,但我正在寻找一种在第三方应用程序上添加自定义管理器而不在现有模型上添加任何新字段的解决方案。然后创建一个代理模型,并将自定义管理器放在代理模型上。但第三方应用程序代码的行为将如何改变?您的意思是什么“更改第三方应用程序代码的行为”?在你的问题中,你说你想要的是一个额外的管理器,该管理器处于活动状态。如果你从代理中实例化一个对象,它的行为将类似于第三方模型,但会有一个额外的管理器。你只需确保在自己的代码中始终使用代理。假设第三方应用程序使用默认管理器的方法,并且你ave在您的自定义管理器中覆盖了它。当第三方应用程序调用field.\u default\u manager.some\u函数时,它将调用默认函数,而不是您的函数。这已经在Django反序列化代码中完成,这就是我为什么要问的原因。