代码之家  ›  专栏  ›  技术社区  ›  Averin Maxim

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

  •  0
  • Averin Maxim  · 技术社区  · 6 年前
    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 回复  |  直到 6 年前
        1
  •  4
  •   schillingt    6 年前

    目前,您一直在迭代实例并一次更新一个实例。然而,Django 2.2将引入 bulk_update() 你想怎么做就怎么做。

        2
  •  0
  •   Averin Maxim    6 年前

    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)
    )