详解Django的 update() 函数:更新查询结果

  • Post category:Python

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 字段更新为 Trueis_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’ 的所有商品价格减半。