[英]Django changing and saving objects of a QuerySet
我正在尝试更改 QuerySet 的一个元素中的字段并保存它,但它似乎没有保存。 你能告诉我我做错了什么吗?
objs = sampleModel.objects.all()
# below code doesn't work
objs[0].text = 'NEW TEXT'
objs[0].save()
# below code does work
index = 0
for obj in objs:
if index == 0:
obj.text = 'NEW TEXT'
obj.save()
您可能想阅读: 当 QuerySets 被评估时。
相关部分在这里处理:
在您执行某些操作来评估查询集之前,实际上不会发生任何数据库活动。
...
切片。 如限制查询集中所述,可以使用 Python 的数组切片语法对查询集进行切片。 对未计算的 QuerySet 进行切片通常会返回另一个未计算的 QuerySet,但如果使用切片语法的“step”参数,Django 将执行数据库查询,并返回一个列表。 对已评估的 QuerySet 进行切片也会返回一个列表。
另请注意,即使对未评估的 QuerySet 进行切片返回另一个未评估的 QuerySet,也不允许对其进行进一步修改(例如,添加更多过滤器或修改排序),因为这不能很好地转换为 SQL 并且它也没有明确的含义。
特别:
对未计算的 QuerySet 进行切片通常会返回另一个未计算的 QuerySet。
现在,只需尝试理解以下代码:
print(id(objs[0]))
print(id(objs[0]))
Output(在我的机器上):
4495005392
4495004112
DIFFERENT
[0] 每次返回一个不同的实例。所以,当你这样做时:
objs[0].text = 'NEW TEXT'
objs[0].save()
我们在不同的实例上运行。
objs[0].text
将修改某些实例的text
属性(我们称之为instance1
)。
objs[0].save()
将保存another instance
(不是instance1
另一个实例,我们称之为instance2
)。 instance2
将具有text
的原始值,保存它不会有任何区别!
当我们这样做时:
objs = sampleModel.objects.all()
obj = objs[0]
obj.text = 'NEW TEXT'
obj.save()
我们将objs[0]
返回的实例存储在obj
中,并在以下几行中对同一实例进行操作,因此它将起作用。
当我们这样做时:
index = 0
for obj in objs:
if index == 0:
obj.text = 'NEW TEXT'
obj.save()
我们在以下几行中对同一实例进行操作,因此它将起作用(类似于上面的示例)。
将 object 保存到变量中,然后 save() 应该可以工作。
objs = sampleModel.objects.all()
x = objs[0]
x.text = 'NEW TEXT'
x.save()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.