Tem uma armadilha no DROP TABLE IF EXISTS do copy_to_keep_table quando um pai tem mais de um filho no recorte. Se Post e Comment tiverem FK pra auth_user, a segunda chamada recria o _keep__auth_user só com os autores do segundo filho, e a reinserção do outro filho cai em 23503. O keep de cada pai tem que ser montado de uma vez só, com UNION das FKs de todos os filhos (o _meta.get_fields() do pai lista as relações reversas).
E tem a FK pra própria tabela, tipo Comment.parent: o id % 10 = 0 guarda resposta sem o comentário pai. Dá pra puxar os ancestrais antes de subir a árvore:
WITH RECURSIVE anc(id) AS (
SELECT parent_id FROM _keep__blog_comment WHERE parent_id IS NOT NULL
UNION
SELECT c.parent_id FROM blog_comment c JOIN anc ON c.id = anc.id
WHERE c.parent_id IS NOT NULL
)
INSERT INTO _keep__blog_comment
SELECT * FROM blog_comment
WHERE id IN (SELECT id FROM anc)
AND id NOT IN (SELECT id FROM _keep__blog_comment);
Como a checagem IMMEDIATE roda no fim do comando, a ordem das linhas no INSERT de volta não importa.