django - 如何覆盖自定义管理器类中的 .update() 方法
问题描述
如何在自定义管理器中覆盖 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
推荐阅读
- swift - 快速测量类·角度转换精度
- winpcap - 有人可以解释 BPF 中的主机参数吗
- python-3.x - 如何使用 beautifulsoup 抓取 javascript 文本
- python - 如何使用 google sheet api 获取列数?Python
- javascript - JavaScript server.io 不断获得新连接
- django - Nginx 重定向(非 www 到 www)不适用于 Certbot
- puppeteer - 获取 Puppeteer 中被阻止的请求列表
- synchronization - webots模拟同步
- angular - Angular 6 FormGroup.disable() 方法不适用于我的模板驱动的 NgForm
- python - 如何在不同方向显示颜色网格?