我想用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 2.2版本现在有bulk_update个版本.

旧答案:

请参阅以下Django文档部分

Updating multiple objects at once

简而言之,你应该能够使用:

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)

请看documentation.

但是,请注意:

  • 这不会使用ModelClass.save方法(所以如果你里面有一些逻辑,它就不会被触发).
  • 不会发出Django 信号.
  • 不能在切片查询集上执行.update(),它必须在原始查询集上执行,因此需要使用.filter().exclude()方法.

Django相关问答推荐

使用FormWizard将信息从视图传递到表单

使用自定义的AuthBackend时,无法使用request.user.is_authenticated或@login_required修饰符

Django 相当于子查询

Pymongo:搜索文档时忽略空输入值

Pytest-django - 测试创建和传递所需的用户对象

Django获取具有值的相关对象的计数并将其添加到注释中

超级用户在基于类的视图中进行身份验证

直接在模型类上使用 Django 管理器与静态方法

TestCase 类中的 setUpClass、setUpTestData 和 setUp 有什么区别?

如何获取 Django 模型来自的应用程序?

在 django web 应用程序中,如何给用户自己的子域?

如何使用 django 发送 POST 请求?

在python中查找对对象的所有引用

Django表单集:首先需要?

Django ORM 能否以可靠的与后端无关的方式存储无符号 64 位整数(又名 ulong64 或 uint64)?

如何重置 PostgreSQL 表上的 ID 序列

在 django admin 中链接到外键对象

django sql 查询如何使用不区分大小写的同时包含?

如何动态访问 Django 模型字段详细名称?

Django Debug Toolbar:了解时间面板( time panel)