在数据库中存储每个芹菜任务的任务ID

pyn*_*ice 7 django celery celery-task django-celery

我用过芹菜MySQL.我想将任务id存储为数据库或celery变量中的普通整数task.我怎样才能做到这一点?

Col*_*ole 13

为什么不创建芹菜任务模型,并将芹菜任务ID保存到该模型?

class CeleryModel(models.Model):
    celery_task_id = models.CharField(max_length = 50, unique=True)
Run Code Online (Sandbox Code Playgroud)

然后:

def some_celery_task():
    result = celery_task.delay()
    celery_task = CeleryModel(celery_task_id = result.id)
    celery_task.save() # added save line
Run Code Online (Sandbox Code Playgroud)

那么你的整数值将是:celery_task.id与实际的唯一celery_task_id相对应.

更新:另一种方式......

首先python manage.py inspectdb > inspectdb.py.在该文件中,您会发现:

class CeleryTaskmeta(models.Model):
    id = models.IntegerField(primary_key=True)
    task_id = models.CharField(max_length=765, unique=True)
    status = models.CharField(max_length=150)
    result = models.TextField(blank=True)
    date_done = models.DateTimeField()
    traceback = models.TextField(blank=True)
    hidden = models.IntegerField()
    meta = models.TextField(blank=True)
    class Meta:
        db_table = u'celery_taskmeta'
Run Code Online (Sandbox Code Playgroud)

接下来,python manage.py startapp celery_model.将此文件放在models.py文件中.我用南方,所以我的最后一步是python manage.py convert_app celery_model.但是,它是不必要的.现在您可以对此celery数据表进行django级别访问,并可以将每个任务的主键读取为整数值.例如

>>> ct = CeleryTaskmeta.objects.get(id=1)
>>> for k,v in ct.__dict__.items(): print k,v
... 
status SUCCESS
task_id 2fa95f24-7640-434c-9fef-0732ac1d23c7
date_done 2013-02-17 19:22:56+00:00
traceback None
_state <django.db.models.base.ModelState object at 0x10263fa90>
meta eJxrYKotZAzlSM7IzEkpSs0rZIotZC7WAwBREgb9
result gAJLBC4=
hidden 0
id 1
Run Code Online (Sandbox Code Playgroud)

聪明的人会知道如何制作CeleryTaskmeta一个只读模型,因为我不认为你会想要篡改数据表.

更新:到你问题的最后部分:

>>> from celerytest.tasks import add
>>> result = add.delay()
>>> result.int_id = 1
>>> for k,v in result.__dict__.items(): print k,v
...
parent None
app <Celery default:0x10264df10>
task_name celerytest.tasks.add
int_id 1
id 01503afd-d196-47af-8e10-e7dc06603cfc
backend <djcelery.backends.database.DatabaseBackend object at 0x1026842d0>
Run Code Online (Sandbox Code Playgroud)