2014-11-03 25 views
1

我有一個簡單的模型Django應用程序:如何從數據庫中自動選取一個元素?

class ThingToPick(models.Model): 
    title = models.CharField(max_length=200) 
    start_date = models.DateTimeField('date published', auto_now=True) 
    status = models.IntegerField(default=0) 
    filedata = models.TextField() 

的一些觀點,我有:

exec_item = ThingToRun.objects.filter(status=0).order_by('start_date')[0] 
    exec_item.status = 1 
    exec_item.save() 

我需要一些方法來挑選一個從每個ThingToRun只有一個併發用戶。我知道這是壞的,我該如何解決它?

+0

你試圖建立一個類似隊列機制,這是調度?我有這個權利嗎? – 2014-11-03 14:58:26

+0

@Puciek是的,你是對的 – vz0 2014-11-03 15:01:17

+1

真的,你應該使用一個適當的任務管理器,即芹菜。 – 2014-11-03 15:03:08

回答

1

你真正想在這裏做的不僅僅是挑選某些東西,而是挑選某些東西並將其標記爲正在處理中,以便在此期間沒有其他人選擇它。所以,你想用的方法select_for_update

exec_item = ThingToRun.objects.select_for_update().filter(status=0).order_by('start_date')[0] 
exec_item.status = 1 
exec_item.save() 
...process exec_item .... 
+0

這裏不是競賽條件嗎?我沒有爲我的視圖配置任何事務。 – vz0 2014-11-03 15:26:37

+1

是的,你需要在autocommit關閉的塊內部完成。 – 2014-11-03 15:29:29

相關問題