如何在 Django 中使用单个查询集选择记录并更新它?
如何在同一个 queryset
上运行 update
和 select
语句,而不必执行两个查询: - 一项选择对象 - 以及更新对象
SQL 中的等效项类似于:
update my_table set field_1 = 'some value' where pk_field = some_value
How do I run an update
and select
statements on the same queryset
rather than having to do two queries:
- one to select the object
- and one to update the object
The equivalent in SQL would be something like:
update my_table set field_1 = 'some value' where pk_field = some_value
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
使用查询集对象
更新方法
:
Use the queryset object
update
method:Django 数据库对象使用相同的 save() 方法来创建和更改对象。
参考: https://docs.djangoproject.com/en/5.0/参考/模型/实例/
Django database objects use the same save() method for creating and changing objects.
Ref.: https://docs.djangoproject.com/en/5.0/ref/models/instances/
这个答案比较了上述两种方法。
如果您想在一行中更新多个对象,请执行以下操作:
否则,您将必须迭代查询集并更新单个对象:
方法 1 更快,因为与方法 2 相比,它只进行一次数据库查询这会进行“n+1”次数据库查询。 (对于查询集中的 n 个项目)
拳头方法进行一个数据库查询,即 UPDATE,第二种方法进行两次:SELECT,然后 UPDATE。
updated_on
或任何此类相关字段,则直接更新(即方法 1)不会触发它。方法 1 用于查询集,因此有可能一次更新多个对象,而不是方法 2 的情况。
This answer compares the above two approaches.
If you want to update many objects in a single line, go for:
Otherwise you would have to iterate over the query set and update individual objects:
Approach 1 is faster because, it makes only one database query, compared to approach 2 which makes 'n+1' database queries. (For n items in the query set)
Fist approach makes one db query ie UPDATE, the second one makes two: SELECT and then UPDATE.
The tradeoff is that, suppose you have any triggers, like updating
updated_on
or any such related fields, it will not be triggered on direct update ie approach 1.Approach 1 is used on a queryset, so it is possible to update multiple objects at once, not in the case of approach 2.
第一种方法
第二种方法
第三种方法
可以使用
get_object_or_404
第四种方法
如果需要,
pk=some_value
存在,然后更新
它,否则使用update_or_create
创建
新值。1st method
2nd Method
3rd method
By using
get_object_or_404
4th Method
if you required if
pk=some_value
exist thenupdate
it other wisecreate
new one by usingupdate_or_create
.如果您需要根据旧字段值设置新值,请执行以下操作:
使用 查询表达式:
这将自动执行更新,即使用对数据库的一个更新请求,而不先读取它。
If you need to set the new value based on the old field value that is do something like:
use query expressions:
This will execute update atomically that is using one update request to the database without reading it first.
仅在
serializer
事物中的情况下,您可以以非常简单的方式进行更新!仅在
form
事物中的情况下!强>only in a case in
serializer
things, you can update in very simple way!only in a case in
form
things!接受的答案效果很好,但它带来了一些不需要的副作用。
例如,您正在使用 imageField, update() 将工作并更新其他数据,但不会更新您的 imageField 数据
这是一些带有很好解释的示例 使用 update() 方法时 Django ImageField 不更新
Accepted answer works great, but it comes with some unwanted side effect.
For example, you are using imageField, the update() will work and update others data, but not update your imageField data
Here is some example with good explanation Django ImageField is not updating when update() method is used
上面提到的答案效果很好,但它会产生一些不需要的副作用,因此为了避免此类错误,请将数据库代码写入异常块中。
Above mentioned answer works great, but it happens with some unwanted side effect, so to avoid such errors writes your db code inside exception blocks.