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

  • Post category:Python

Django中的update_or_create()函数实现了如下功能:若数据表中已存在符合条件的记录,则更新该记录;若不存在符合条件的记录,则创建一个新的记录。因此,该函数具有一定的「幂等性」特性。

该函数的使用方法为:

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

参数说明:
– defaults: 若新建记录,则传入的默认值字典;
– **kwargs: 关键字参数,需要满足的查询条件;

返回值:一个元组,第一个元素为目标对象,第二个元素为Boolean值,表示是否新建了记录。

下面提供两个使用实例:

  1. 示例一

假设我们有一个User模型,该模型有两个字段username和email,可以通过username字段或email字段查找对应的用户。现在我们想更新一个用户的信息,这个用户的username为”kate”,email为”kate@gmail.com”。如果该用户已存在,则更新该用户的邮箱为”kate@qq.com”,如果不存在,则新建一个该用户的记录,并且默认邮箱为”kate@qq.com”。

from myapp.models import User

# 使用username查询
obj, created = User.objects.update_or_create(
    username="kate",
    defaults={"email": "kate@qq.com"}
)

# 如果email不唯一,则需要使用email字段来查询
# obj, created = User.objects.update_or_create(
#     email="kate@gmail.com",
#     defaults={"email": "kate@qq.com"}
# )

obj.email = "kate@qq.com"
obj.save()

代码中,第一个参数传入了查询条件username=”kate”,第二个参数通过defaults传入了默认更新的值”email”: “kate@qq.com”。如果该用户已存在,则更新该用户的信息;如果不存在,则自动新建一个该用户的记录。

  1. 示例二

假设我们有一个Article模型,该模型有三个字段title、content和published,可以通过title字段查询对应的记录。现在我们想新建一篇名为”我的校园生活”的文章,如果该文章已存在,则将该文章的published字段更新为当前时间,并且输出数据库中该文章的published字段的值。

from datetime import datetime
from myapp.models import Article

obj, created = Article.objects.update_or_create(
    title="我的校园生活",
    defaults={"content": "这是我的校园生活...", "published": datetime.now()}
)

if not created:
    print(obj.published)

代码中,第一个参数传入了查询条件title=”我的校园生活”,第二个参数通过defaults传入了默认新建时的字段值”content”: “这是我的校园生活…”和”published”: datetime.now()。如果该文章已存在,则将该文章的published字段更新为当前时间,否则新建一条记录。同时,如果该文章已存在,则输出该文章的published字段的值。

以上就是对Django的update_or_create()函数作用和使用方法的详细讲解与实例说明。