1. 简介
在进行 Django 数据库操作时,经常需要查询某个对象是否存在,如果存在则返回该对象,如果不存在则创建该对象。get_or_create 是 Django 提供的一个非常方便的函数,它可以在查询对象的同时,如果对象不存在则创建该对象,并返回一个元组,元组的第一个元素是查询到的对象,第二个元素是一个表示创建操作的布尔值。
2. 使用方式
2.1 参数
get_or_create 函数的参数中,第一个参数是用于查询的参数,其余的参数是用于创建对象的参数。
def get_or_create(
self,
defaults=None,
**kwargs,
):
在使用 get_or_create 函数时,可以通过设置 defaults 参数来指定创建对象时的默认属性。
2.2 示例
try:
obj = MyModel.objects.get(title='test')
except MyModel.DoesNotExist:
obj = MyModel.objects.create(title='test', content='example')
上述代码使用了 try-catch 结构,在查询对象时如果出现 DoesNotExist 的异常,则会在 catch 中创建一个新的对象。
而使用 get_or_create 函数时,可以直接简洁地操作:
obj, created = MyModel.objects.get_or_create(title='test',
defaults={'content': 'example'})
上述代码中,obj 为查询到的对象,created 为一个布尔值,表示是否创建了新的对象。
2.3 注意事项
需要注意的是,get_or_create 函数不仅会查询对象是否存在,还会进行创建操作。因此,在高并发场景下使用 get_or_create 函数可能会存在一定的性能问题。
3. 返回值是 tuple 的问题
使用 get_or_create 函数之后,我们得到的结果是一个包含两个元素的 tuple,这是设计的初衷之一,这样可以同时获取到查询结果和创建操作的状态。
例如,我们可以通过判断 created 的值来确定对象是否是新创建的:
obj, created = MyModel.objects.get_or_create(title='test',
defaults={'content': 'example'})
if created:
print('对象是新创建的')
else:
print('对象已经存在')
4. 结论
get_or_create 函数是 Django 提供的一个非常实用的函数,能够在查询对象的同时进行创建操作。返回的元组包含查询结果和创建操作状态,更加灵活方便。
在实际使用中,我们需要注意高并发场景下的性能问题,并在尽可能的地方进行优化。