Django 的 update() 函数可以用来更新数据库记录,它可以更新一个或多个满足筛选条件的记录的字段值。update() 函数能够避免先查询再更新的操作,从而提高了代码的执行效率。下面是 update() 函数的完整攻略。
update() 函数的基本用法
update() 函数的基本语法如下:
Model.objects.filter(conditions).update(field1=value1, field2=value2, ...)
其中,Model
是数据库模型,conditions
是筛选记录的条件,可以是单个条件,也可以是多个条件,field1=value1, field2=value2, ...
是要更新的字段及其更新值,可以填写多个字段及更新后的值。
例如,更新一个满足条件的记录的某一个字段:
from app.models import User
User.objects.filter(username='testuser').update(is_active=True)
这里的 User
是数据库模型,username='testuser'
是条件,即要更新 username
为 ‘testuser’ 的记录,.update(is_active=True)
表示将该记录的 is_active
字段更新为 True
。
注意:update() 函数操作与条件筛选不同,update() 函数返回的是更新记录的数目而不是所有符合条件的记录。
update() 函数的高级用法
1. 使用 F 对象进行更新
F 对象是 Django 内置的一个用来处理数据库列的对象,通过 F 对象可以利用数据库内的列进行比较、计算等操作。在 update() 函数中使用 F 对象可以基于字段间的关系进行更新。
例如,将价格打 5 折:
from django.db.models import F
from app.models import Product
Product.objects.filter(category='Book').update(price=F('price') * 0.5)
这里的 F('price') * 0.5
表示将该记录的 price
字段更新为原来的 50%。
2. 批量更新字段值
update() 函数可以同时更新多个字段的值。
例如,同时修改多个字段的值:
from app.models import User
User.objects.filter(is_staff=True).update(is_active=True, is_superuser=False)
这里的 is_staff=True
是查询条件,即更新所有 is_staff=True
的记录,.update(is_active=True, is_superuser=False)
表示将该记录的 is_active
字段更新为 True
,is_superuser
字段更新为 False
。
update() 函数的注意事项
- update() 函数可用于单个对象、多个对象、或查询结果集等多种方式。
- update() 函数不会执行信号操作。
- update() 函数不能触发相关联的信号。
实例说明
实例 1
一个应用中用户注册后默认处于未激活状态,此时需要将所有注册但未激活的用户设为禁用状态。将 User
模型中 is_active
字段为 False
的所有用户记录更新为 True
,可通过以下代码实现:
from app.models import User
# 将未激活的用户设为禁用状态
User.objects.filter(is_active=False).update(is_active=True)
上述代码利用 update() 函数,将数据库中 User
模型中 is_active
字段为 False
的所有用户记录更新成了 True
。
实例 2
在一个电商应用中,卖家需要对某些商品的价格打折,例如所有书籍降价 5 成。利用 update() 函数将某一种 Product
模型中满足条件的商品价格减半,可以通过以下代码实现:
from django.db.models import F
from app.models import Product
# 书籍打折 5 成
Product.objects.filter(category='Book').update(price=F('price') * 0.5)
上述代码利用 update() 函数和 F 对象,将数据库中 Product
模型中,category
字段为 ‘Book’ 的所有商品价格减半。