我是個新手的Django。我在Uni的網絡編程課程中做了一個粗略的計數器。我做了一個類HitCount:Django的頁面命中計數器併發
from django.db import models
# Create your models here.
class HitCount(models.Model):
count = models.IntegerField()
然後我在意見文件中使用此代碼:
def index(request):
#try getting a hitcounter, if there is none, create one
try:
hc = HitCount.objects.get(pk=1)
except:
hc = HitCount(count=0)
hc.save()
pass
#get a queryset containing our counter
hc = HitCount.objects.filter(pk=1)
#increment its count and update it in db
hc.update(count=F('count')+1)
#ATM hc is a queryset, so hc.count will just return how many
#counters are in the queryset (1). So we have to get the
#actual counter object
hc = HitCount.objects.get(pk=1)
#and return its count
return render_to_response('hitcount/index.html', {'count': hc.count})
這是我的index.html文件:
<p>{{count}}</p>
這似乎是工作蠻好的,但我想知道:
- 這是一個合理的方式這樣做?增量的代碼是否應該真正駐留在視圖文件中?或者我應該將其轉化爲課堂中的一種方法?
- 這是併發安全或是否需要使用某種類型的鎖?部分任務是使計數器併發安全。我使用SQLite,它使用事務,所以我認爲它應該是好的,但我可能會錯過一些東西。
交易將不被自動使用。雖然它確實刪除了ORM的一些細節,但如果您使用的是MySQL,可以在一個查詢中完成:INSERT INTO hitcount(id,count)VALUES(1,1)ON DUPLICATE KEY UPDATE count = count + 1'。這避免了完全交易的需要。 (您可以在Oracle或SQL服務器中使用MERGE INTO,在PostgreS中使用UDF) –
歡迎您的輸入。你介意擴大一點嗎?例如。如何強制使用交易?以及如何使用手動查詢消除對交易的需求?那麼不應該有兩個查詢同時執行的風險,導致錯誤? – fred
查看[這裏](https://docs.djangoproject.com/en/dev/topics/db/transactions/#django-s-default-transaction-behavior),瞭解有關Django如何處理事務以及如何讓Django自動使用交易。至於我的備選建議,每個更新都是在單個語句中執行的,並且由數據庫服務器將其視爲原子,所以沒有事務。 –