如何用Django批量更新?
我想用Django更新一个表 – 在原始SQL中是这样的:
update tbl_name set name = 'foo' where name = 'bar'
我的第一个结果是这样的 – 但这是讨厌的,不是吗?
list = ModelClass.objects.filter(name = 'bar') for obj in list: obj.name = 'foo' obj.save()
有没有更优雅的方式?
请参阅django文档中的update
函数: https : //docs.djangoproject.com/en/dev/ref/models/querysets/#update 。
总之你应该可以使用:
ModelClass.objects.filter(name='bar').update(name="foo")
您也可以使用F
对象来执行增加行的操作:
from django.db.models import F Entry.objects.all().update(n_pingbacks=F('n_pingbacks') + 1)
请参阅文档: https : //docs.djangoproject.com/en/1.9/topics/db/queries/
但是请注意:
- 这不会使用
ModelClass.save
方法(所以如果你有一些逻辑,它将不会被触发)。 - 没有django信号将被发射。
考虑使用GitHub上的 django-bulk-update
。
安装: pip install django-bulk-update
实现:(代码直接从项目自述文件)
from bulk_update.helper import bulk_update random_names = ['Walter', 'The Dude', 'Donny', 'Jesus'] people = Person.objects.all() for person in people: r = random.randrange(4) person.name = random_names[r] bulk_update(people) # updates all columns using the default db
更新:正如马克在评论中指出的,这不适合一次更新数千行。 虽然它适用于小批量10到100年代。 适合您的批处理大小取决于您的CPU和查询的复杂性。 这个工具更像是一辆手推车而不是一辆自卸车。