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

时间:2018-12-27 12:04:24

标签: 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类中?我应该如何覆盖它们?

1 个答案:

答案 0 :(得分: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