当我们使用 Django 操作数据库时,经常会遇到需要找出某个对象或者创建新对象的情况,如果使用经典的方式,就需要写多次try except
语句,显得冗长且不易维护。为了解决这个问题,Django 的 ORM 提供了 update_or_create() 函数,该函数可以更新一个已存在的对象,或者创建新的对象,而不需要考虑是否存在的问题。
update_or_create()
函数的基本语法如下:
update_or_create(defaults=None, **kwargs)
defaults
: 一个字典,包含需要使用的更新值。**kwargs
: 一个字典,包含筛选条件。如果找到该记录,则使用defaults
参数更新该记录,否则创建一个新的记录。
下面,我们通过两个实例来进一步说明update_or_create()
的使用方法。
实例一:更新一个已存在的对象
假设我们有一个模型类User
,包含两个字段name
和age
,其中name
为唯一字段。现在,我们想要更新存在的User
对象的年龄值。代码如下:
from django.db.models import F
from myapp.models import User
# 筛选条件:根据 name 字段查找对应的 User 对象
user = User.objects.filter(name='Tom').first()
# 如果找到该记录,则更新年龄值;否则,创建一个新的记录
updated_user, created = User.objects.update_or_create(
name='Tom',
defaults={'age': F('age') + 1}
)
print(updated_user.age)
update_or_create()
函数接受筛选条件并试图在数据库中查找符合条件的用户,然后将符合条件的用户记录更新年龄字段。如果找到了指定的用户,则返回对应的对象;如果没找到,则创建一个新的User
对象并返回。
上述代码中,由于我们指定了name='Tom'
作为筛选条件,且数据库中存在该用户,因此函数不会创建新记录,而是更新了年龄字段,并将更新的对象updated_user
返回。因为我们使用了F
函数,所以用户新的年龄被设置为之前年龄加 1。
实例二:新增一个对象
现在,我们有一个模型类Book
,包含两个字段name
和price
。我们想要创建一个新的对象,如果指定名称的书本已经存在,则更新价格字段。代码如下:
from myapp.models import Book
# 如果找到该记录,则更新价格值;否则,创建一个新的记录
new_book, created = Book.objects.update_or_create(
name='《冰与火之歌》',
defaults={'price': 99.99},
)
print(new_book.price)
在上面的代码中,我们调用update_or_create()
函数,并指定筛选条件为name='《冰与火之歌》'
,然后指定defaults
为{'price': 99.99}
,表示如果找到匹配的记录,则将其价格设置为 99.99。因为我们尚未在数据库中创建这本书,所以函数将创建新的Book
对象,并返回该对象以及一个标志变量created
,其值为True
(表示该函数创建了新的记录)。
总之,update_or_create()
函数可以让我们在查询或更新数据库时,实现更高效、更简单的操作。