Используемый сигнал - это не post_save
, а m2m_changed
, который отправляется через много после сохранения модели в базе данных.
@models.signals.m2m_changed(sender=MyModel.second_m2m.through)
def duplicate_other_on_this_if_empty(sender, instance, action, reverse, model, pk_set, **kwargs):
# just before adding a possibly empty set in "second_m2m", check and populate.
if action == 'pre_add' and not pk_set:
instance.__was_empty = True
pk_set.update(instance.first_m2m.values_list('pk', flat=True))
@models.signals.m2m_changed(sender=MyModel.first_m2m.through)
def duplicate_this_on_other_if_empty(sender, instance, action, reverse, model, pk_set, **kwargs):
# Just in case the "first_m2m" signals are sent after the other
# so the actual "population" of the "second_m2m" is wrong:
if action == 'post_add' and not pk_set and getattr(instance, '__was_empty'):
instance.second_m2m = list(pk_set)
delattr(instance, '__was_empty')
Редактировать: следующий код прощеи на основе новых знаний об определении моделей
В вашем коде сигналы 'first_m2m' отправляются перед 'second_m2m' (это действительно зависит от определения вашей модели).Таким образом, мы можем работать в предположении, что когда сигналы 'second_m2m' получены, 'first_m2m' уже заполнен текущими данными.
Это делает нас счастливее, потому что теперь вам нужно только проверить m2m-pre-адд:
@models.signals.m2m_changed(sender=MyModel.second_m2m.through)
def duplicate_other_on_this_if_empty(sender, instance, action, reverse, model, pk_set, **kwargs):
# just before adding a possibly empty set in "second_m2m", check and populate.
if action == 'pre_add' and not pk_set:
pk_set.update(instance.first_m2m.values_list('pk', flat=True))