在Django中使用JSONField进行批量更新

时间:2019-01-17 11:29:37

标签: python django postgresql django-jsonfield

whens = [When(pk=x, then=_json['info'][str(x)]) for x in ids]
Clinics.objects.filter(pk__in=ids).update(
  info_json=Case(*whens, output_field=JSONField())
)

我想使用JSONField()的Case-When语句执行批量更新。当我在一个愚蠢的循环中使用save()在每次迭代中执行此操作时,一切正常。但是上面的代码写道:django.db.utils.ProgrammingError: can't adapt type 'dict'是关于第二行的。我也尝试了json.loads(),但是没有成功。我应该怎么做才能执行此多次更新?

我正在使用Python 3.6.3和Django 1.11.16

2 个答案:

答案 0 :(得分:2)

目前,您只能遍历实例并一次更新一个实例。但是,Django 2.2将引入bulk_update()来完成您想要的操作。

答案 1 :(得分:0)

实际上,在进行转换时,bulk_update很简单。这是无需迁移到Django 2.2的解决方案

field_type = Clinic._meta.get_field('info_json')
whens = [When(pk=x, then=Value(_json['info'][str(x)], output_field=field_type) 
for x in ids]
Clinics.objects.filter(pk__in=ids).update(
  info_json=Cast(Case(*whens, output_field=field_type),output_field=field_type)
)