Ошибка, о которой я говорю в моем вопросе, возможно, потому что я запустил ложную миграцию с p_id как FK в models.py, который сказал Django, что p_id_id уже существует в БД, просто создайте файл миграции. Когда я повторил все с нуля без фальшивой миграции, ошибка исчезла.
Django автоматически не изменит m2m на FK (один ко многим), и это имеет смысл. Если я запускаю миграции после изменения m2m на FK, таблица сопоставления appname_t_p удаляется, и данные теряются навсегда. Я сделал следующее, и это сработало:
Таблица сопоставления, созданная вручную в течение m2m 'appname_t_p'.
create table atp as select * from appname_t_p;
измените m2m на FK в models.py (как показано в вопросе). затем бежали миграции (не поддельные миграции). Это создало новый столбец со всеми пустыми значениями p_id_id в таблице T.
Затем вручную написал оператор обновления sql для добавления значений из вышеупомянутой резервной копии таблицы atp в столбец p_id_id (все NULLS) в таблице appname_t.
UPDATE appname_t t1
SET p_id_id = t2.p_id
FROM atp t2
WHERE t2.t_id = t1.id;
Тогда проверил значения, и это было правильно.