Почему эта функция не может быть подключена к `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()
Вернуться на верх