使用bulk_update将记录和字段列表更新为Django模型

时间:2019-05-27 15:47:59

标签: python django django-models django-views django-2.2

我想更新模型中的记录列表。我更希望使用bulk_update。 这些是我从用户那里获取的数据,想要在模型中进行更新:

{'2': ['present', 'study'], '3': ['study'], '4': ['present'], '6': ['no-present', 'no-study']}

数字代表用户的ID,每个键的值也是需要更新的字段。 我的模型也是:

#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问题有关在这个问题中,我   能够使用create_bulk在数据库中存储我的记录,并且   这个问题是关于更新这些数据的。

那我该怎么做??我还看到this链接,看到bulk_update必须带有参数:'obj'和'fields'。 这些参数是什么?

1 个答案:

答案 0 :(得分: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"])