bulk_update(objs, fields, batch_size=None)
objs
- это список объектов, которые вы хотите обновить, а fields
- это список полей, которые вы хотите обновить в этих объектах.(имеется в виду те, которые вы изменили).
Например, если ваш clean_objects
содержит кучу Rollcall
объектов и вы хотите обновить поле is_present
с True
до False
,вы бы сделали
roll_call1 = RollCall(...) # assume is_present is True
roll_call2 = RollCall(...) # assume is_present is True
# Update the objects
roll_call1.is_present = False
roll_call2.is_present = False
# Create the list
clean_object = [rollcall_1, rollcall_2,]
# Update in db
Rollcall.objects.bulk_update(clean_objects, ["is_present"])
Хорошо, обновите ваш пример.Если у вас есть эти данные
data = {'2': ['present', 'study'], '3': ['study'], '4': ['present'], '6': ['no-present', 'no-study']}
, вы сначала извлечете все объекты Rollcall
, на которые есть ссылки в этих данных (в идеале с одним запросом, в духе эффективности и массового использования позже).Затем вы обновите соответствующие поля для каждого объекта на основе данных выше.Когда все сделано, вызовите метод массового обновления.
# Assuming the number in the `data` is the student id and not the rollcall id
rollcalls = Rollcall.objects.filter(student__id__in=data.keys())
for rollcall in rollcalls:
# Parse the data
values = data[str(rollcall.student.id)]
if "present" in values:
rollcall.is_present = True
if "no-present" in values:
rollcall.is_present = False
if "study" in values:
rollcall.is_study = True
if "no-study" in values:
rollcall.is_study = False
Rollcall.objects.bulk_update(rollcalls, ["is_present", "is_study"])