这是我参与2022首次更文挑战的第19天,活动详情查看2022首次更文挑战
使用update
Example.objects.filter(id=481).update(total_calories = 10)
执行的SQL语句是:
UPDATEExample SETtotal_calories = 10 WHERE(Example.user_id = asdfasdf ANDExample.id = 481 ); args=(10, u'asdfasdf', 481)
SQL语句简短而且执行速度要优于使用save的速度。
从SQL的执行情况来看,使用upate是要优于save方式的。
从使用情境上看,update更加适用于批量数据更新,而save则更适合当然也只适合做单条记录的数据更新操作了。
使用save
save()方法默认保存全部字段,如果表字段过多的时候会导致sql执行变慢,如果只是更新操作建议使用update_fields字段,仅更新该列表中命名的字段,该update_fields参数可以是任何可迭代的包含字符串的参数。空的update_fieldsIterable将跳过保存。无值将对所有字段执行更新。
product.save(update_fields=['name'])
save() 默认保存后会看到sql语句中更新了所有字段,而save的值是之前获取时候的字段值,是缓存下来的,并不一定最新,可能中途其他地方被更新过
\
何时使用save(commit=False)方法
Stackoverflow上其实已经有了一段非常精炼的答案。英文原文如下,我把它翻译了一下:
That's useful when you get most of your model data from a form, but need to populate some null=False fields with non-form data. Saving with commit=False gets you a model object, then you can add your extra data and save it.
当你通过表单获取你的模型数据,但是需要给模型里null=False字段添加一些非表单的数据,该方法会非常有用。如果你指定commit=False,那么save方法不会理解将表单数据存储到数据库,而是给你返回一个当前对象。这时你可以添加表单以外的额外数据,再一起存储。
\
何时使用save_m2m方法及如何使用
save_m2m方法只用来存储多对多的关系。当你同时满足下面两个条件时,你需要使用此方法。如果你直接使用save()或form_valid()方法,是可以直接存储多对多(m2m)关系的,不需要用save_m2m。
坑:
django orm 的update 和 save 同时使用, 只有save()生效, update不生效。因为django filter的update(通常为批量更新数据时)则是因为直接调用sql语句 不通过 model层
同时类似更新时间这种字段(auto_now_add)也会因为没有调用update字段导致不生效
update(or save()????)后的对象不会变,
a = TESTModel.object.filter(id =1).first()
a.update(num=1)
print(a.num)
0