Как переопределить метод .update () внутри пользовательского класса менеджера - PullRequest
0 голосов
/ 27 декабря 2018

Как я могу переопределить метод update () модели django внутри собственного менеджера?

Я хотел бы изменить поведение некоторых методов (all (), update (), filter ())модели Django, и я попытался переопределить, используя то, что предлагает мой код здесь, но ничего не происходит.Я попытался использовать 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?Как мне их переопределить?

1 Ответ

0 голосов
/ 27 декабря 2018

Я думаю, что вы делаете это правильно с переопределением 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
...