2
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

4

2 回答 2

4

暂时你被困在迭代实例并一次更新它们。但是,Django 2.2 将介绍bulk_update()which will do you want。

于 2019-01-18T21:20:44.027 回答
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)
)
于 2019-01-20T19:03:44.267 回答