我正在编写一个 Django 应用程序,我需要一个函数来更新数据库中的字段。是否有任何理由采用其中一种方法而不是另一种方法?
def save_db_field(name,field,value):
obj = MyModel.objects.get(name=name)
obj.field = value
obj.save()
def update_db_field(name,field,value):
MyModel.objects.get(name=name).update(field=value)
似乎第二个更好,因为它是在一次数据库调用中完成的,而不是两次。有没有理由为什么先获取然后更新更好?
原文由 zoidberg 发布,翻译遵循 CC BY-SA 4.0 许可协议
有几个关键的区别。
update
用于查询集,因此可以一次更新多个对象。正如 @FallenAngel 指出的那样,自定义
save()
方法的触发方式存在差异,但同样重要的是要记住signals
和ModelManagers
我构建了一个小型测试应用程序来展示一些有价值的差异。我使用的是 Python 2.7.5、Django==1.7.7 和 SQLite,请注意,最终的 SQL 可能因不同版本的 Django 和不同的数据库引擎而异。好的,这是示例代码。
models.py
:views.py
:这导致了这些 SQL 查询:
我们只有一个查询
update()
和两个查询save()
。接下来,让我们谈谈重写
save()
方法。很明显,它只为save()
方法调用一次。值得一提的是,.objects.create()
也调用save()
方法。但是
update()
不会在模型上调用save()
。如果没有为 --- 调用update()
save()
方法,那么信号也不会被触发。输出:如您所见
save()
触发Manager
的get_queryset()
两次。当update()
只有一次。解析度。如果您需要“静默”更新您的值,而不调用
save()
- 使用update
。用例:last_seen
用户的领域。当您需要正确更新模型时,请使用save()
。