繁体   English   中英

Django 更改和保存 QuerySet 的对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM