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