O ORM do Django gerencia conexões de banco de dados em variáveis locais de thread. Assim, cada thread diferente acessando o ORM criará sua própria conexão. Você pode ver isso nas primeiras linhas de
django/db/backends/__init__.py
. Se você deseja limitar o número de conexões de banco de dados feitas, deve limitar o número de threads diferentes que realmente acessam o ORM. Uma solução pode ser implementar um serviço que delegue solicitações ORM a um pool de threads ORM dedicados. Para transmitir as solicitações e seus resultados de e para outras threads, você terá que implementar algum tipo de mecanismo de passagem de mensagens. Como esse é um problema típico de produtor/consumidor, os documentos do Python sobre encadeamento devem dar algumas dicas de como fazer isso.
Editar: Acabei de pesquisar no Google por "pooling de conexão django". Há muitas pessoas que reclamam que o Django não fornece um pool de conexão adequado. Alguns deles conseguiram integrar um pacote de pool separado. Para o PostgreSQL, eu daria uma olhada no middleware pgpool.