Переопределить метод обновления для набора запросов — Django

Как мы можем изменить метод обновления по умолчанию для набора запросов в django, поскольку он не вызывает метод сохранения для каждого объекта. И поскольку я переопределил метод сохранения, мне нужно, чтобы он вызывался каждый раз при изменении объекта. Я искал документ django, но это только для get_query_set, есть ли что-то подобное для метода обновления.

Спасибо


person ashish    schedule 10.10.2012    source источник


Ответы (1)


Это сработало для меня


class MyQuerySet(models.query.QuerySet):
    def update(self, *args, **kwargs):
        # here queryset update method overridden
        pass

class NewManager(models.Manager):
    def get_queryset(self):
        # this is to use your custom queryset methods
        return MyQuerySet(self.model, using=self._db)

class MyModel(models.Model):
    objects = NewManager()
    myfield = models.SomeTypeOfField(**kwargs)
person ashish    schedule 10.10.2012
comment
Вам действительно нужно переопределить функцию update() на уровне NewManager? - person Chad; 07.08.2013
comment
@chad: да, MyModel.objects.update(**kwargs) фактически использует метод, определенный в NewManager, а MyModel.objects.filter(**kwargs).update(**kwargs) использует метод, определенный в MyQuerySet - person ashish; 08.08.2013
comment
Отлично, спасибо за информацию. Ваше решение мне очень помогло! - person Chad; 08.08.2013
comment
На самом деле, может быть, это зависит от используемой версии Django? Исходный код функции update() для классов-менеджеров просто return self.get_query_set().update(*args, **kwargs). Итак, если вы хотите, чтобы и filter().update(), и objects.update() вели себя одинаково, похоже, вам просто нужно переопределить его на уровне набора запросов (если я что-то не понимаю). - person Chad; 08.08.2013
comment
@Чад: ты прав. Метод обновления определен только для наборов запросов, и да, метод управления обновлением вызывает метод обновления на уровне набора запросов. - person ashish; 27.08.2013