Работа с изменениями m2m в Django при сохранении объектаPython

Программы на Python
Ответить
Anonymous
 Работа с изменениями m2m в Django при сохранении объекта

Сообщение Anonymous »

Итак, я создаю функцию веб-перехватчика для конкретной модели Django, например, я запускаю веб-перехватчики для двух событий. Один предназначен для создания, другой для изменения, например, я хочу запускать их каждый раз, когда объект этой модели создается/обновляется.
Итак, обычно для других моделей я следую следующему шаблону:

Код: Выделить всё

class Model1(models.Model):
...
fields
...

def save(self. *args, **kwargs):
self.is_new = self._state.adding
super().save(*args, **kwargs)

self.post_save()

def post_save(self):

if self.is_new:
# Trigger webhook with self object as the payload.
trigger_webhook(self)
Теперь, с текущей моделью, над которой я работаю, единственная разница состоит в том, что в ней есть поле m2m, например:

Код: Выделить всё

class Model2(models.Model):
...
fields
m2m_field = models.ManyToManyField(
Model3,
through="Model1Model2",
blank=True,
related_name="...",
)
...

Теперь для этой модели при срабатывании save() поле m2m всегда оказывается пустым, поскольку, очевидно, оно обновляется после этого момента, и нам нужно это поле как часть нашей полезной нагрузки в веб-перехватчике. Одним из решений, которое я попробовал, было использование сигнала типа:

Код: Выделить всё

@receiver(m2m_changed, sender=Model1Model2)
def signal_ready(sender, instance, action, **kwargs):
if action not in ("post_add", "post_remove", "post_clear"):
return

trigger_model_webhook(instance)
Это сработало в случае, когда поле m2m было изменено или добавлено во время создания, но ограничение этого подхода заключается в том, что если мы создаем объект, в котором поле m2m не было добавлено или изменено, веб-перехватчик вообще не срабатывает, хотя должен.
Существуют ли какие-либо другие возможные подходы для этого, где мы можем добавить условную проверку, чтобы увидеть, получаем ли мы изменение поля m2m или нет? Если мы получим изменение, мы позволим сигналу обработать его, в противном случае мы активируем его вручную с помощью post_save().
Или другой подход, который позволяет нам запрашивать вновь созданный объект отдельно после его создания/обновления, а затем запускать вебхук.
Будем благодарны за любую помощь.

Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/798 ... bject-save
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»