Jag hade exakt samma problem som ditt. Jag implementerade ett övervakningsskript med hjälp av watchdogs-biblioteket, och i slutet av "wait_timeout" skulle MySQL-felet uppstå.
Efter några försök med "django.db.close_old_connections()"-funktionen fungerade det fortfarande inte, men jag försökte stänga gamla anslutningar varje definierat tidsintervall, vilket inte fungerade. Jag ändrade close-kommandot till att köras endast före anropet av mitt anpassade hanteringskommando (som är kommandot som kommer att interagera med db och som används för att krascha med MySQL-fel) och det började fungera.
Uppenbarligen från den här sidan , anledningen till att det händer är att funktionen "close_old_connection" endast är länkad till HTTP-begäransignaler, så den kommer inte att aktiveras i specifika anpassade skript. Dokumentationen av Django säger inte det, och jag förstod ärligt talat också saker på samma sätt som du förstod.
Så vad du kan försöka göra är att lägga till samtalet för att stänga den gamla anslutningen innan du interagerar med db:
from django.db import close_old_connections
close_old_connections()
do_something_with_db()