У меня есть модель M содержит три многотонных поля (a, b, c) для трех разных моделей в django.dajngo, обработка сигналов m2m по модели с несколькими ManyToManyField
class M (models.Model):
name = models.CharField()
a = models.ManyToManyField(A)
b = models.ManyToManyField(B)
c = models.ManyToManyField(C)
знает, я хочу, чтобы обрабатывать любые изменения в моей модели M и отправку HttpRequest к URL соответственно. , как вы знаете в сигнале после сохранения модели M, значения атрибутов для a, b и c еще не установлены, поскольку они будут установлены при завершении сохранения модели M. (правило ManyToManyField)
I написать один обработчик для моей модели для обработки каких-либо изменений (либо создать новый экземпляр или обновить поле/поля)
@receiver(post_save, sender=M)
@receiver(m2m_changed, sender=M.a.through)
@receiver(m2m_changed, sender=M.b.through)
@receiver(m2m_changed, sender=M.c.through)
def M_changes_handler(sender, **kwargs):
is_instance_set_compeletly(kwargs['instance']):
#send_and_HttpRequest(url, data = instance)
def is_instance_set_compeletly(kwargs['instance']):
if M.a.all() is not None and M.b.all() is not None and
M.c.all()is not None
flag = True
else:
flag = False
return flag
Теперь рассмотрим запрос на обновление (который изменяет все поля) на модели M будет посылать сигналы для всех поля a, b и c; поэтому три httpRequests отправят моему отправителю три версии экземпляра! с другой стороны, когда пользователь просто изменяет поле, например b модели M, эта функция отправит только один httpRequest.
Я хочу, чтобы справиться с этой проблемой динамически и просто отправить один запрос за любой тип изменений на моей модели М. мне было интересно, если кто-то может помочь мне :)
* Обратите внимание, что приведенный выше код только проект и может содержать синтаксическую ошибку, поэтому игнорируйте их;)
Обновление: моя проблема решена! Процесс сохранения модели, содержащей m2mfields, интересен! Прежде всего поля M, которые не являются полями m2m, например. это поле char, внешний ключ или т. д. были установлены перед вызовом post_save. Поэтому в post_save обновляются их значения Хотя m2mfields не будут установлены до тех пор, пока сохранение модели не будет закончено. Затем m2mchange сигналы, вызываемые для установки m2mfields . Единственный способ иметь обновленную версию вашей модели - это переопределить форму save в admin.py, потому что будет вызываться «сохранение формы» после завершения всех полей m2m.
Можете ли вы добавить пример, как вы решили проблему? –