小编aut*_*ate的帖子

Django 模型对象作为 celery 任务的参数引发 EncodeError - 'someModelName 类型的对象不可 JSON 序列化'

我正在处理一个 django 项目(我对 django 还很陌生),并遇到了在我的视图和 celery 任务之间传递模型对象的问题。

我正在从包含多个ModelChoiceField字段的表单中获取输入,并在 celery 任务中使用选定的对象。当我使用 someTask.delay(x, y, z) 对任务进行排队(从视图中的 post 方法)时,其中 x、y 和 z 是 ModelChoiceFields 表单中的各种对象,我收到错误object of type <someModelName> is not JSON serializable

也就是说,如果我创建一个简单的测试函数并将任何相同的对象从表单传递到函数中,我会得到预期的行为,并且会记录表单中所选对象的名称。

def test(object):
    logger.debug(object.name)
Run Code Online (Sandbox Code Playgroud)

我根据上述错误做了一些探索,发现django 序列化器可以通过在将serializers.serialize('json', [template]),视图中使用的对象传递给 celery 任务之前序列化该对象来实现解决方法。

然后,我可以通过使用访问其所需位作为字典来访问 celery 任务中的对象template = json.loads(template)[0].get('fields')- 虽然这有效,但它看起来确实有点不优雅,我想看看这里是否缺少一些东西。

我显然愿意接受任何反馈/指导,但我的主要问题是:

  • 为什么object...is not JSON serializable在将模型对象传递给 celery 任务时会出现错误,而在传递给简单的测试函数时却不会出现错误?

  • 在对 celery 任务进行排队之前使用 django 序列化器的方法是否被认为是可接受/正确的,或者是否有更干净的方法来实现此目标?

任何建议将不胜感激。

回溯:我也尝试在这里发布完整的回溯,但是包括这导致该帖子被标记为“这看起来像垃圾邮件”

Internal Server Error: /build/
Traceback (most recent call last):
  File "/home/tech/sandbox_project/venv/lib/python3.8/site-packages/kombu/serialization.py", …
Run Code Online (Sandbox Code Playgroud)

django celery python-3.x

3
推荐指数
1
解决办法
3414
查看次数

标签 统计

celery ×1

django ×1

python-3.x ×1