Perché Python DB API è per impostazione predefinita in modalità AUTOCOMMIT=OFF e (almeno per MySQLdb) a livello di isolamento REPEATABLE READ. Ciò significa che dietro le quinte hai una transazione di database in corso (InnoDB è un motore transazionale) in cui il primo accesso a una determinata riga (o forse anche a una tabella, non ne sono sicuro) corregge la "vista" di questa risorsa per la parte rimanente di la transazione.
Per evitare questo comportamento, devi "aggiornare" la transazione corrente:
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)
-- nota che il transaction.autocommit decorator serve solo per accedere alla modalità di gestione delle transazioni (questo può essere fatto anche manualmente usando le funzioni transaction.enter_transaction_management/leave_transaction_managemen).
Un'altra cosa - da tenere presente - l'autocommit di Django non è lo stesso autocommit che hai nel database:è completamente indipendente. Ma questo non rientra nell'ambito di questa domanda.
Modificato il 22/01/2012
Qui è una "risposta gemella" a una domanda simile.