Eftersom Python DB API är som standard i AUTOCOMMIT=OFF-läge, och (åtminstone för MySQLdb) på REPEATABLE READ-isoleringsnivå. Detta innebär att du bakom kulisserna har en pågående databastransaktion (InnoDB är transaktionsmotor) där den första åtkomsten till en given rad (eller kanske till och med tabell, jag är inte säker på) fixar "vy" av denna resurs för den återstående delen av transaktionen.
För att förhindra detta beteende måste du "uppdatera" aktuell transaktion:
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)
-- Observera att transaction.autocommit decorator är endast till för att gå in i transaktionshanteringsläge (detta kan också göras manuellt med funktionerna transaktion.enter_transaction_management/leave_transaction_managemen).
En sak till - för att vara medveten om - Djangos autocommit är inte samma autocommit som du har i databasen - det är helt oberoende. Men det här är utanför räckvidden för denna fråga.
Redigerad 2012-01-22
Här är ett "tvillingsvar" på en liknande fråga.