Итак, вы сохраняете из админки, а это значит, что ваш сигнал (post_save
надо, pre_save
тут точно мимо) отрабатывает сразу после того, как будет сохранён объект User
. Пока всё ок.
Но именно с админкой есть нюанс: после того, как сохранится основная модель и выполнятся соответствующие этому действию сигналы, начнётся сохранение m2m связей, которые 100% у вас есть на странице админки, и перезапишут те данные, которые вы миллисекундами ранее сохранили с помощью сигнала.
У меня была когда-то похожая проблема, и если мне не изменяет память, я создавал свой сигнал, который вызывал из переопределённого метода класса админки модели после сохранения вообще всего, а в обработчике своего кастомного сигнала уже спокойно работал с m2m-связями без этих проблем.
Также, можно поиграться с имеющимся в Django сигналом m2m_changed
, но это будет костыль, потому что этот сигнал будет вызван 2N раз, где N - число добавлений/удалений из m2m.