如何覆盖自定义管理器中的 .update() 方法 class
How do I override the .update() method inside a custom manager class
如何在自定义管理器中重写 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:
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() 方法?
我想修改 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:
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