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

  • Post category:Python

update_or_create()函数是 Django 的 ORM 模块提供的一个实用函数,允许在数据库中更新现有记录或创建一个新记录(如果它不存在)。

其具体用法为:

Model.objects.update_or_create(defaults=None, **kwargs)

其中 Model 是指数据库中的表结构模型类,在 defaults 中可以指定需要更新或需要创建的记录具体的键值对。

同时,它还支持多个 kwargs 参数作为查询条件,以保证唯一性,如果存在,则更新模型中对应的字段数据,如果不存在,则创建一个新的模型记录,相当于 save 和 get_or_create 两个操作的组合。

接下来,提供两个实例来说明它的使用:

实例1

在一个电商平台的商品详情页面中,用户可以对商品的库存量进行修改,当库存量为空时,我们需要在数据库中新建库存记录,否则更新库存记录。
假如我们数据库中建立了一个名为 Inventory 的模型类,目的是记录商品库存的变化信息,其中字段包括 product_namecurrent_stockupdate_at 等。

# 导入Inventory 模型类
from .models import Inventory   
# 获取参数值
product_name = request.POST.get('product_name')
current_stock = request.POST.get('current_stock')
# 数据库中查找存在的库存记录,如果存在,则更新 current_stock 的值;如果不存在,则新建库存记录
updated, created = Inventory.objects.update_or_create(
    product_name=product_name,
    defaults={'current_stock': current_stock},
)
# 更新执行时间 update_at
updated.update_at = timezone.now()
updated.save()
#当库存记录创建或更新完成后,跳转到成功提示页面

在此示例中,我们使用 update_or_create 函数通过 product_name 查询是否存在匹配的库存记录。如果存在,则更新 current_stock 的值,如果不存在,则创建一个新的记录。最后更新执行时间 update_at 并保存记录。

实例2

在一个博客网站的编辑页面,编辑人员可能会修改博客文章的标签,每篇文章只能有一个标签,如果文章的标签已存在于标签库中,我们则更新文章的标签数据。否则,我们将新建一个标签记录,然后将文章与该标签进行关联。

假如我们数据库中建立了一个名为 Tag 的模型类,目的是记录文章标签,其中字段包括 tag_namecreate_atupdate_at 等。

# 导入Tag 模型类
from .models import Tag   
# 获取参数值
tag_name = request.POST.get('tag_name')
# 更新标签记录,如果存在,则更新 update_at 的值;如果不存在,则新建标签记录
tag, created = Tag.objects.update_or_create(
    tag_name=tag_name,
    defaults={'tag_name': tag_name},
)
# 更新执行时间 create_at 和 update_at
tag.create_at = timezone.now()
tag.update_at = timezone.now()
tag.save()
#将文章与标签进行关联
article.tags.add(tag)
#当文章标签创建或更新完成后,跳转到成功提示页面

在此示例中,我们使用 update_or_create 函数通过 tag_name 查询是否存在匹配的标签记录。如果存在,则更新 update_at 的值,如果不存在,则创建一个新的记录。然后更新执行时间 update_atcreate_at,并将文章与标签进行关联。

总结一下,update_or_create() 函数是一个非常实用的 Django ORM 函数,比起单独使用 get_or_createsave 函数,它可以避免在查询数据库时出现数据重复等问题,同时提供了非常便利的记录更新和创建功能,将大大提高开发Django应用程序的效率和可靠性。