Массовое обновление с JSONField в Django - PullRequest
0 голосов
/ 17 января 2019
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())
)

Я хочу выполнить массовое обновление, используя операторы Case-When для JSONField (). Когда я делаю это в глупом цикле с помощью save () на каждой итерации, все работает отлично. Но код выше пишет мне: django.db.utils.ProgrammingError: can't adapt type 'dict' говорит о второй строке. Я также попробовал json.loads (), но это не сработало. Что я должен сделать, чтобы выполнить это многократное обновление?

Я использую Python 3.6.3 и Django 1.11.16

Ответы [ 2 ]

0 голосов
/ 20 января 2019

На самом деле 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)
)
0 голосов
/ 19 января 2019

В настоящее время вы застреваете итерациями по экземплярам и обновляете их по одному. Тем не менее, Django 2.2 представит bulk_update(), который будет делать то, что вы хотите.

...