Почему эта функция не может быть подключена к `QuerySet` в django?
Я хочу подключить некоторые функции к Models.Manager
.
Реализует функцию, которая представляется сигналами.
Но когда я использую demo_1()
для вызова update()
.
Он вызовет QuerySet.update()
Вызов hook_func()
не будет произведен.
Как это исправить?
# manangers.py
import functools
from django.db.models import Manager
def bulk_operation_decorator(func, obj, original_func):
@functools.wraps(original_func)
def wrapper(*args, **kwargs):
res = original_func(*args, **kwargs)
func(obj)
return res
return wrapper
class BulkLinkageManager(Manager):
def __init__(self, func, linkages=None, *args, **kwargs):
super(BulkLinkageManager, self).__init__(*args, **kwargs)
if not linkages:
linkages = []
self.linkages = linkages
self.__hook_func = func
def __hook(self, target=None):
if not target:
target = self
for linkage in self.linkages:
original_func = getattr(target, linkage, None)
if callable(original_func):
setattr(target, linkage, bulk_operation_decorator(
self.__hook_func, target, original_func
))
def get_queryset(self):
queryset = super(BulkLinkageManager, self).get_queryset()
self.__hook(target=queryset)
return queryset
# models.py
class MyModel(models.Model):
objects = BulkLinkageManager(hook_func, ['update'])
x = models.IntegerField()
# hooks.py
def hook_func(queryset):
logging.info('success')
# demo.py
import logging
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Demo.settings')
django.setup()
from models import MyModel
def demo_1():
# `hook_func()` will not be called
my_models = MyModel.objects.filter(x = 1)
my_models.update(x=6)
def demo_2():
# `hook_func()` will be called
my_models = MyModel.objects.all()
my_models.update(x=6)
def main():
for i in range(20):
x = i % 4
MyModel.objects.create(x = x)
if __name__ == '__main__':
main()