如何使用 Django 进行“批量更新"? [英] How to 'bulk update' with Django?
本文介绍了如何使用 Django 进行“批量更新"?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想用 Django 更新一个表 - 在原始 SQL 中是这样的:
I'd like to update a table with Django - something like this in raw SQL:
update tbl_name set name = 'foo' where name = 'bar'
我的第一个结果是这样的 - 但这很糟糕,不是吗?
My first result is something like this - but that's nasty, isn't it?
list = ModelClass.objects.filter(name = 'bar')
for obj in list:
obj.name = 'foo'
obj.save()
有没有更优雅的方式?
推荐答案
更新:
Django 2.2 版本现在有一个 bulk_update.
参考下面的django文档部分
Refer to the following django documentation section
简而言之,您应该可以使用:
In short you should be able to use:
ModelClass.objects.filter(name='bar').update(name="foo")
您还可以使用 F
对象来执行诸如增加行之类的操作:
You can also use F
objects to do things like incrementing rows:
from django.db.models import F
Entry.objects.all().update(n_pingbacks=F('n_pingbacks') + 1)
请参阅文档.
但是,请注意:
- 这不会使用
ModelClass.save
方法(所以如果你有一些逻辑,它不会被触发). - 不会发出 django 信号.
- 您不能对切片的 QuerySet 执行
.update()
,它必须在原始 QuerySet 上执行,因此您需要依靠.filter()
code> 和.exclude()
方法.
- This won't use
ModelClass.save
method (so if you have some logic inside it won't be triggered). - No django signals will be emitted.
- You can't perform an
.update()
on a sliced QuerySet, it must be on an original QuerySet so you'll need to lean on the.filter()
and.exclude()
methods.
这篇关于如何使用 Django 进行“批量更新"?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文