详解Django的 update_or_create() 函数:更新或创建对象

  • Post category:Python

当我们使用 Django 操作数据库时,经常会遇到需要找出某个对象或者创建新对象的情况,如果使用经典的方式,就需要写多次try except语句,显得冗长且不易维护。为了解决这个问题,Django 的 ORM 提供了 update_or_create() 函数,该函数可以更新一个已存在的对象,或者创建新的对象,而不需要考虑是否存在的问题。

update_or_create() 函数的基本语法如下:

update_or_create(defaults=None, **kwargs)
  • defaults: 一个字典,包含需要使用的更新值。
  • **kwargs: 一个字典,包含筛选条件。如果找到该记录,则使用defaults参数更新该记录,否则创建一个新的记录。

下面,我们通过两个实例来进一步说明update_or_create()的使用方法。

实例一:更新一个已存在的对象

假设我们有一个模型类User,包含两个字段nameage,其中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,包含两个字段nameprice。我们想要创建一个新的对象,如果指定名称的书本已经存在,则更新价格字段。代码如下:

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()函数可以让我们在查询或更新数据库时,实现更高效、更简单的操作。