详解Django的 get_or_create() 函数:获取或创建一个对象

  • Post category:Python

get_or_create()是Django ORM中的一个非常实用的函数,其作用是在数据库中查询数据,如果存在则返回该数据对象,如果不存在则创建该数据对象并返回。下面就详细介绍一下get_or_create()的使用方法及其提供的便利。

函数定义

get_or_create()的定义为:

get_or_create(defaults=None, **kwargs)

函数接收的是关键字参数,其中kwargs是用键值对的方式传递查询条件的,这些条件用于在数据库中查找需求数据。defaults参数是可选的,当数据库中不存在符合条件的数据时,defaults参数用于指定创建该数据时所要插入的默认值。

使用方法

在一个Django模型类中,我们可以使用get_or_create()方法轻松地实现数据的查找和插入,具体方法如下:

# 导入模型类
from myapp.models import MyModel

# 使用get_or_create()方法查询并创建数据,返回值为元组,第一个参数为查询到(或创建的)对象,第二个参数为标志符(True表示新建数据,False表示查找已存在数据)
obj, created = MyModel.objects.get_or_create(name='test', age=18, gender='male')

# 对象存在,仅仅进行查询
obj, created = MyModel.objects.get_or_create(name='test')

# 不存在该对象时,使用默认值创建
obj, created = MyModel.objects.get_or_create(name='test', defaults={'age': 20, 'gender': 'female'})

在上述代码中,我们以MyModel作为例子,展示其get_or_create()方法的基本使用方法。在第一次调用get_or_create()方法时,会首先去查询MyModel数据库中是否符合参数要求的对象,如果没有找到就在MyModel数据库中插入一条信息,如果找到了就返回该对象。如果用于查询的参数在MyModel数据库中并不存在,get_or_create()函数就会使用defaults参数来创建一个新的对象。

范例说明

下面将提供两个实例说明,解释get_or_create()方法在具体情境下的使用方法。

实例一:搜寻班级信息

假设现在我们要查询一个学生所在的班级信息。我们已经有了这个学生的学号和姓名,但不知道TA的班级信息。如果班级信息不存在于数据库中,我们还需要新建一个班级的数据。

# 导入班级和学生的的模型类
from myapp.models import ClassModel, StudentModel

# 查询学生所在班级,如果不存在就创建一个
class_obj, created = ClassModel.objects.get_or_create(name='Class 1', teacher='Teacher A')

# 查询学生信息
student_obj = StudentModel.objects.get(student_id='123456', name='Tom')

# 给学生对象绑定班级信息
student_obj.class_obj = class_obj
student_obj.save()

在上述代码中,我们使用了get_or_create()方法来查询班级信息,如果不存在就使用默认值创建出一个名称为“Class 1”,教师为“Teacher A”的班级,并将其绑定给这个学生对象。

实例二:创建唯一的用户信息

假设网站要求每个用户填写注册日志时必须填写唯一的 Email地址。如果该 Email 地址已经在数据库中存在,我们将返回用户数据;否则,我们将新建一个用户。

# 导入用户模型类
from myapp.models import UserModel

# 查询或创建用户信息
user_obj, created = UserModel.objects.get_or_create(email='test@gmail.com', defaults={'password': '123456'})

在上述代码中,我们使用了get_or_create()方法来查询用户信息,如果不存在,将以“test@gmail.com”作为 Email地址,以默认值‘123456’作为密码,在数据库创建一条新的用户数据;如果该邮箱地址已存在,将放回已有用户的数据。

结语

get_or_create()是一个Django ORM功能强大的函数,可以大大简化我们在编写代码时所需的工作量。同时,本文也提供了两个具体的实例来介绍get_or_create()的使用方法,希望对读者有所帮助。