Ho avuto esattamente lo stesso problema del tuo. Ho implementato uno script di monitoraggio utilizzando la libreria watchdogs e, entro la fine di "wait_timeout", sarebbe stato generato un errore MySQL.
Dopo alcuni tentativi con la funzione "django.db.close_old_connections()", non funzionava ancora, ma stavo tentando di chiudere le vecchie connessioni ogni intervallo di tempo definito, che non funzionava. Ho modificato il comando di chiusura in modo che venga eseguito solo prima della chiamata del mio comando di gestione personalizzato (che è il comando che interagirà con db e utilizzato per arrestarsi in modo anomalo con l'errore MySQL) e ha iniziato a funzionare.
Apparentemente da questa pagina , il motivo per cui ciò accade è perché la funzione "close_old_connection" è collegata solo ai segnali di richiesta HTTP, quindi non verrà attivata in specifici script personalizzati. La documentazione di Django non lo dice, e onestamente anche io ho capito le cose nello stesso modo in cui tu le capivi.
Quindi, quello che puoi provare a fare è aggiungere la chiamata per chiudere la vecchia connessione prima di interagire con db:
from django.db import close_old_connections
close_old_connections()
do_something_with_db()