我正在使用 cookiecutter-django 构建一个小型 Django 项目,我需要在后台运行任务。即使我使用 cookiecutter 设置了项目,我也遇到了 Celery 的一些问题。
假设我有一个模型类Job
,它包含三个字段:默认主键、UUID 和日期:
class Job(models.Model):
access_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
date = models.DateTimeField(auto_now_add=True)
现在,如果我在 Django 视图中执行以下操作,一切正常:
job1 = Job()
job1.save()
logger.info("Created job {}".format(job1.access_id))
job2 = Job.objects.get(access_id=job1.access_id)
logger.info("Retrieved job {}".format(job2.access_id))
如果我创建一个完全相同的 Celery 任务,我会收到一个错误:
django.db.utils.ProgrammingError: relation "metagrabber_job" does not exist
LINE 1: INSERT INTO "metagrabber_job" ("access_id", "date") VALUES ('e8a2...
同样,这就是我的 Postgres docker 容器当时所说的:
postgres_1 | 2018-03-05 18:23:23.008 UTC [85] STATEMENT: INSERT INTO "metagrabber_job" ("access_id", "date") VALUES ('e8a26945-67c7-4c66-afd1-bbf77cc7ff6d'::uuid, '2018-03-05T18:23:23.008085+00:00'::timestamptz) RETURNING "metagrabber_job"."id"
有趣的是,如果我查看我的 Django 管理员,我确实看到创建了一个对象Job
,但它带有不同的 UUID,如日志所说..
如果我然后设置CELERY_ALWAYS_EAGER = False
让 Django 执行任务而不是 Celery:瞧,它会再次正常工作而不会出错。但是在 Django 中运行任务并不是重点。
我做了相当多的搜索,我只发现了解决方案要运行的类似问题manage.py migrate
。但是我已经这样做了,这不是解决方案,否则无论有没有 Celery,Django 都无法执行有问题的代码。
发生什么了?我的所有模型对象都得到了完全相同的行为。
编辑:以防万一,我使用的是 Django 2.0.2 和 Celery 4.1