如何在 JSONField 的“更新”中使用 Django F() 表达式

how to use Django F() expression in `update` for JSONField

我的 postgres 数据库中有大约 1200 万条记录需要更新(因此我需要以高效的方式进行更新)。 我正在使用 Django。

我必须更新 jsonfield 列 (extra_info) 以在同一模型中使用不同列(related_type_id 这是一个整数)的值。

尝试用 update 来完成。这似乎是最有效的方法。 示例:

Person.objects.all().update(extra_info={
  "type": "Human",
  "id": F('related_type_id')
})

此错误显示:“类型 F 的对象不是 JSON 可序列化的”。 我认为 F() 将返回该列的值(应该是一个整数),该值应该是可序列化的。 这可以做到吗?还是我试图以错误的方式进行操作。 我真的不想在 for 循环中迭代并用 save() 更新每条记录,因为这会花费太长时间。记录太多了。

Django 数据库函数 JSONObject 应该可以工作,它 returns 来自 key-value 对的有效 JSON 对象并且可以传递 F 个对象

from django.db.models import F, Value
from django.db.models.functions import JSONObject

Person.objects.all().update(extra_info=JSONObject(
  type=Value('Human'),
  id=F('related_type_id')
))