Masik
@Masik
Программирую понемногу

Как упростить код сигнала в Django?

Перед каждым сохранением определенного списка моделей мне необходимо произвести некоторые вычисления.
@receiver(pre_save, sender=Model6)
@receiver(pre_save, sender=Model5)
@receiver(pre_save, sender=Model4)
@receiver(pre_save, sender=Model3)
@receiver(pre_save, sender=Model2)
@receiver(pre_save, sender=Model1)
def recalculate_data(instance, **kwargs):
    ...

В принципе меня все устраивает, но хотелось бы избавиться от такого множества декораторов, но в голову не приходит мысль как это исполнить. Есть только предположение, что recevier так же нужно декорировать.
  • Вопрос задан
  • 2697 просмотров
Решения вопроса 1
Tiendil
@Tiendil
Разработчик ПО.
Напишите декоратор, который принимает список моделей, а внутри оборачивает функцию в @receiver для каждой из них.

Примерно так.

def my_receiver(models):

    def decorator(func):
        for model in models:
            func = receiver(pre_save, sender=model)(func)
        return func

    return decorator

@my_receiver(models=[Model1, Model2, Model3])
def recalculate_data(instance, **kwargs):
    pass
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы