如何用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和查询的复杂性。 这个工具更像是一辆手推车而不是一辆自卸车。