Omdat Python DB API standaard in AUTOCOMMIT=OFF-modus staat, en (tenminste voor MySQLdb) op REPEATABLE READ-isolatieniveau. Dit betekent dat je achter de schermen een lopende databasetransactie hebt (InnoDB is een transactie-engine) waarin de eerste toegang tot een bepaalde rij (of misschien zelfs een tabel, ik weet het niet zeker) de "weergave" van deze bron voor het resterende deel van de transactie.
Om dit gedrag te voorkomen, moet u de huidige transactie 'vernieuwen':
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)
-- merk op dat de transaction.autocommit decorator is alleen bedoeld om de transactiebeheermodus te openen (dit kan ook handmatig worden gedaan met behulp van de functies transaction.enter_transaction_management/leave_transaction_managemen).
Nog een ding - om op te letten - Django's autocommit is niet dezelfde autocommit die je in de database hebt - het is volledig onafhankelijk. Maar dit valt buiten het bestek van deze vraag.
Bewerkt op 22/01/2012
Hier is een "tweelingantwoord" op een vergelijkbare vraag.