Я хочу обновить список записей в моей модели. Я хочу использовать bulk_update
более предпочтительно.
Это мои данные, которые я взял у пользователей и хочу обновить их в своей модели:
{'2': ['present', 'study'], '3': ['study'], '4': ['present'], '6': ['no-present', 'no-study']}
Числа представляют идентификатор пользователя, а значения каждого ключа также являются полями, которые необходимо обновить. Также моя модель:
#models.py
class Rollcall(models.Model):
student = models.ForeignKey(User)
curriculum_session = models.ForeignKey(CurriculumSession)
is_present = models.BooleanField(default=False, )
is_study = models.BooleanField(default=False,)
This question in the persuit of this question In that question, I was able to store my record using
create_bulk
in the database and this question is about updating those data.
Итак, как я могу это сделать? Также я вижу ссылку это и вижу, что у bulk_update есть аргумент: «obj» и «fields». Что это за аргументы?
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"])
Обновленный ответ.
Большое спасибо- @ns0
Большое спасибо. Я думаю, что моя проблема немного отличается от вашего ответа. Поэтому я обновляю свой вопрос. @ns0