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()