У меня возникла проблема с тем, как формы на основе Django сохраняют форму. Я использую form.ModelForm
для одной из моих моделей, которая имеет некоторые отношения «многие ко многим».Форма модели Django сохраняет m2m после экземпляра
В методе сохранения модели, я проверить значение некоторых из этих отношений, чтобы изменить другие атрибуты:
class MyModel(models.Model):
def save(self, *args, **kwargs):
if self.m2m_relationship.exists():
self.some_attribute = False
super(MyModel, self).save(*args, **kwargs)
Даже если я заселена некоторые данные в отношениях m2m в моей форме, я self.m2m_relationship
при сохранении модели и на удивление это был пустой QuerySet
. В конце концов я обнаружил следующее:
Метод form.save()
вызывается для сохранения формы, он относится к классу BaseModelForm
. Затем этот метод возвращает save_instance
, функцию в forms\models.py
. Эта функция определяет локальную функцию save_m2m()
, которая сохраняет отношения «многие ко многим» в форме.
Вот вещь, проверить порядок save_instance
выбирает при сохранении и экземпляра и M2M:
instance.save()
save_m2m()
Очевидно, что вопрос здесь. Метод экземпляра save
называется первым, поэтому self.m2m_relationship
был пустым QuerySet
. Этого еще не существует.
Что я могу сделать? Я не могу просто изменить порядок в функции save_instance
, потому что это часть Django, и я могу сломать что-то еще.
Итак, что говорит документ, в основном, что сигнал будет срабатывать, если оба «MyModel» и экземпляр модели связаны, когда либо вносят изменения в существующую связь? – dabadaba
Да, между ними есть невидимая таблица, это MyModel.m2m_relationship.through, если это изменяется, тогда сигнал отправляется независимо от того, как это произошло. Я не знаю, какой экземпляр отправлен, но вам нужно попробовать это. – RemcoGerlich
Ну да, это действительно неважно, потому что это будет только «MyModel», который меняет его. И если это был другой, я думаю, что все-таки я бы изменил действие m2m, которое нужно применить в любом случае. – dabadaba