2014-11-03 64 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

相关问题