django - 如何重写自定义管理器类中的 .update() 方法

标签 django django-models django-queryset django-managers

如何在自定义管理器中重写 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 类中?我应该如何覆盖它们?

最佳答案

我认为您使用 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

关于django - 如何重写自定义管理器类中的 .update() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53944777/

相关文章:

django - Django 中的 CELERYBEAT_SCHEDULE 和 @periodic_task 装饰器之间的主要区别是什么

django - 注释两个字段相乘的和

Django 管理操作日志记录 : how to display initial and result value of field changes?

python - django 一次重写删除级联

跨模型的Django Queryset?

python - Django 一对多模型

python - Django django.test 客户端post请求

Django在两个字段上组合过滤器

python - Django Python 时间序列 - 可重用的应用程序和数据库模式

python - sqlalchemy : filter by relationship (like django orm)?