Как заметил @Anup Yadav, Celery не подходит для этого случая использования.Хранение ваших задач в базе данных работает нормально, вам просто нужно заблокировать строку, используя select_for_update
, чтобы гарантировать, что задача не может быть выбрана дважды.Что-то вроде этого должно работать:
class Task(models.Model):
is_available = models.BooleanField(default=True)
def pick_task():
"""
Selects a task and marks it as unavailable.
Returns Task or None, if no Task is available.
"""
task = Task.objects.select_for_update().filter(is_available=True).first()
if task is not None:
task.is_available = False
task.save()
return task
Проверка, имеет ли пользователь правильную группу, будет сделана в представлении.Обратите внимание, что pick_task
, вероятно, должен быть методом пользовательского менеджера .