Django: как запустить функцию после изменения модели m2m

У меня есть m2m отношение между двумя моделями Plot и Station. Поле m2m объявлено внутри модели Station.

Когда пользователь создает/обновляет станцию или участок, я хочу запустить функцию 'download' для создания некоторых файлов конфигурации (которые будут использоваться из другой программы), используя данные из базы данных. Я добавил эту функцию в методы сохранения и удаления. Но она не работает при изменении поля m2m. Похоже, что функция 'download' вызывается до сохранения поля m2m.

Я обнаружил, что добавление приемника для проверки m2m_changed на модели Station решает эту проблему (даже если это означает запуск функции дважды).

Моя проблема заключается в том, что когда пользователь удаляет участок, станция обновляется в базе данных, как и ожидалось, но я не могу понять, как запустить функцию 'download' на станции после того, как это было сделано.

stations/models.py

class Station(models.Model):
    name = CICharField(
        max_length=50,
        unique=True,
        error_messages={
            "unique": _("That name already exists."),
        },
    )
    ...
    # list of plots available for the station
    plots = models.ManyToManyField(
        Plot,
        blank=True,
        related_name="stations",
    )
    ...
    def save(self, *args, **kwargs):
        """ """
        super().save(*args, **kwargs)
        from .util import download_station

        download_station()

    def delete(self, *args, **kwargs):
        """ """
        super().delete(*args, **kwargs)
        from .util import download_station

        download_station()

@receiver(m2m_changed, sender=Station.plots.through)
def update_station_m2m(sender, instance, action, *args, **kwargs):
    """wait unitl change in Many2Many field get saved"""
    if "post" in action:
        from .util import download_station

        download_station()

plots/models.py

class Plot(models.Model):
    name = CICharField(
        max_length=250,
        unique=True,
        error_messages={
            "unique": _("That name already exists."),
        },
    )

    ...

    def save(self, *args, **kwargs):
        """ """
        super().save(*args, **kwargs)
        # update config files
        from .util import download_plot

        download_plot()

    def delete(self, *args, **kwargs):
        """ """
        super().delete(*args, **kwargs)
        # update config files
        from .util import download_plot

        download_plot()
Вернуться на верх