Protože Python DB API je standardně v režimu AUTOCOMMIT=OFF a (alespoň pro MySQLdb) na úrovni izolace REPEATABLE READ. To znamená, že v zákulisí máte probíhající databázovou transakci (InnoDB je transakční engine), ve které první přístup k danému řádku (nebo možná i tabulce, nejsem si jistý) opraví "pohled" na tento zdroj pro zbývající část transakce.
Abyste tomuto chování zabránili, musíte 'obnovit' aktuální transakci:
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)
– všimněte si, že transaction.autocommit decorator je pouze pro vstup do režimu správy transakcí (to lze také provést ručně pomocí funkcítransakce.enter_transaction_management/leave_transaction_managemen).
Ještě jedna věc - abyste si byli vědomi - Djangoův autocommit není stejný autocommit, který máte v databázi - je zcela nezávislý. Ale to je mimo rozsah této otázky.
Upraveno 22. 1. 2012
Zde je „dvojitá odpověď“ na podobnou otázku.