Обновите список записей и полей в модель django с помощью bulk_update - PullRequest
0 голосов
/ 27 мая 2019

Я хочу обновить список записей в моей модели. Я хочу использовать 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,)

Этот вопрос в ответе на этот вопрос В этом вопросе я смог сохранить свою запись, используя create_bulk в базе данных иэтот вопрос касается обновления этих данных.

Итак, как я могу это сделать? Также я вижу эту ссылку и увидел, что bulk_update должен аргументировать:'obj' и 'fields'. Что это за аргументы?

1 Ответ

1 голос
/ 27 мая 2019

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"])
...