Обновите список записей и полей в модели django с помощью bulk_update

Я хочу обновить список записей в моей модели. Я хочу использовать 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». Что это за аргументы?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
2 675
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Whale 52Hz 27.05.2019 18:58

Обновленный ответ.

NS0 27.05.2019 21:53

Большое спасибо- @ns0

Whale 52Hz 27.05.2019 22:37

Другие вопросы по теме