如何覆盖自定义管理器类中的 .update() 方法

Posted

技术标签:

【中文标题】如何覆盖自定义管理器类中的 .update() 方法【英文标题】:How do I override the .update() method inside a custom manager class 【发布时间】:2019-05-25 11:12:51 【问题描述】:

如何在自定义管理器中覆盖 django 模型的 update() 方法?

我想修改 django 模型的某些方法(all()、update()、filter())的行为,我尝试使用我的代码在此处建议的内容进行覆盖,但没有任何反应。我尝试使用 QuerySet 而不是从 Manager 继承,但我无法正确覆盖它,因为我在整个系统中都得到了空结果。

class undeletedObjectManager(models.Manager):
    def get_queryset(self):
        return super(undeletedObjectManager, self).get_queryset().filter(deleted=False)

    def update(self, *args, **kwargs):
        if "deleted" in args:
            # some logic here
        super().update(*args, **kwargs)

class Transaction(models.Model):
    author = models.ForeignKey(Branch, null=True)
    objects = undeletedObjectManager()    

    def __str__(self):
        return 'Tr. by '.format(self.author.name)

没有达到 update() 方法,我猜这是因为我没有覆盖正确的成员。有具体的方法名吗?在 Manager 和 QuerySet 类中?我应该如何覆盖它们?

【问题讨论】:

【参考方案1】:

我认为您使用 get_queryset 覆盖做得正确。您不需要在此处使用 update() 覆盖。我认为您缺少将其附加到模型类的部分:

class YourModel(models.Model):
    objects = undeletedObjectManager()

更新

我认为您的更新覆盖应该是这样的:

def update(self, *args, **kwargs):
    if "deleted" in args:
        # some logic here
    super().update(**kwargs)

实验性:

你可以试试这样吗

def update(self, **kwargs):
    deleted = kwargs.pop('deleted', False):
    if deleted:
        # some logic here
    super().update(**kwargs)

更新 2:

from django.db.models.query import QuerySet
from django.db.models.manager import BaseManager

class CustomQueryset(QuerySet):
    def update(self, **kwargs):
        deleted = kwargs.pop('deleted', False)
        if deleted:
            # some logic here
        super().update(**kwargs)

class YourManager(BaseManager.from_queryset(CustomQueryset)):
    # rest of the code

【讨论】:

我将它正确地附加到模型类。我可以通过 get_queryset 工作正常这一事实来判断,因为没有返回具有属性 deleted=True 的对象。我现在想要完成的是为 update() 方法添加另一个覆盖。我将通过添加我将其附加到模型的位置来编辑我的问题 @Olfredos6 请参阅我的更新部分。希望对你有帮助 好的,我会改变的,谢谢。但问题依然存在;调用 update() 方法仍然是调用默认方法而不是我的覆盖 工作得像个魅力男!!非常感谢您的耐心@ruddra 顺便说一下@ruddra,请为以后的读者编辑您的代码以防出现以下错误:Basemanager 上的导入语句应为from django.db.models.**manager** import BaseManager,并且还应删除@ 之后的 : 987654329@

以上是关于如何覆盖自定义管理器类中的 .update() 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中使用元类来增加或覆盖添加到类中的方法

在安全管理器类中检查 Create ClassLoader 这个方法是啥

使用UPDATE时如何防止SQL数据库被锁定?

覆盖 touchesBegan:错误 - 方法不会覆盖超类中的任何方法

优化器类中 tensorflow 最小化()函数中的“gate_gradients”属性是啥?

如何使用 WPF 中的 TextShape 类绘制自定义形状?