我想更新模型中的记录列表。我更希望使用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'。 这些参数是什么?
答案 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"])