Porque o Python DB API está por padrão no modo AUTOCOMMIT=OFF e (pelo menos para MySQLdb) no nível de isolamento REPEATABLE READ. Isso significa que nos bastidores você tem uma transação de banco de dados em andamento (InnoDB é um mecanismo transacional) na qual o primeiro acesso a determinada linha (ou talvez até tabela, não tenho certeza) corrige a "visualização" desse recurso para a parte restante do a transação.
Para evitar esse comportamento, você deve 'atualizar' a transação atual:
from django.db import transaction
@transaction.autocommit
def my_count():
while True:
transaction.commit()
print "Number of Things: %d" % Thing.objects.count()
time.sleep(5)
-- observe que o transaction.autocommit decorador serve apenas para entrar no modo de gerenciamento de transações (isso também pode ser feito manualmente usando as funções transaction.enter_transaction_management/leave_transaction_managemen).
Mais uma coisa - para estar ciente - o autocommit do Django não é o mesmo autocommit que você tem no banco de dados - é completamente independente. Mas isso está fora do escopo para esta questão.
Editado em 22/01/2012
Aqui é uma "resposta gêmea" para uma pergunta semelhante.