Имах абсолютно същия проблем от твоя. Внедрих скрипт за наблюдение с помощта на библиотека watchdogs и до края на „wait_timeout“ щеше да се появи грешка в MySQL.
След няколко опита с функцията "django.db.close_old_connections()", тя все още не работи, но се опитвах да затварям стари връзки на всеки определен интервал от време, което не работеше. Промених командата за затваряне да се изпълнява само преди извикването на моята персонализирана команда за управление (която е командата, която ще взаимодейства с db и се използва за срив с MySQL грешка) и тя започна да работи.
Очевидно от тази страница , причината това да се случи е, че функцията "close_old_connection" е свързана само с HTTP сигнали за заявка, така че няма да се задейства в специфични персонализирани скриптове. Документацията на Django не казва това и аз, честно казано, също разбрах нещата по същия начин, както и вие.
И така, това, което можете да опитате да направите, е да добавите обаждането за затваряне на старата връзка, преди да взаимодействате с db:
from django.db import close_old_connections
close_old_connections()
do_something_with_db()