详解Django的 get_or_none() 函数:获取对象或返回 None

  • Post category:Python

get_or_none()是Django框架下一个方便的函数,它能够从ORM中直接查询特定模型实例的查询集,而无需显式捕获ObjectDoesNotExist异常,这个函数的代码实现如下:

def get_or_none(model, *args, **kwargs):
    try:
        return model.objects.get(*args, **kwargs)
    except model.DoesNotExist:
        return None

在使用它之前,我们必须先导入该函数:

from django.shortcuts import get_object_or_404, get_or_none

接下来,我将结合实例来详细阐述get_or_none()函数的作用和使用方法。

作用

get_or_none()的作用是在获取一个模型实例时,如果实例不存在,返回None,避免了我们使用try-except来捕获ObjectDoesNotExist异常。

使用方法

使用get_or_none()函数需要传入相应的参数。其中,第一个参数是目标模型的名称,其余参数可以是查询过滤条件。例如:

from myapp.models import Person
p1 = get_or_none(Person, name='Tom')  # 返回具有name属性值为Tom的Person对象实例或None

接下来,我将演示两个实例,更进一步地阐释get_or_none()函数的使用方法:

实例一

假设我们的网站上有一个名为member的应用,应用中有一个名为User的模型,User有name和email属性,那么我们可以用get_or_none()查询User模型中name=’Alice’且email=’alice@example.com’的用户信息:

from member.models import User
user1 = get_or_none(User, name='Alice', email='alice@example.com')
if user1:
    print(f"用户名:{user1.name} 邮箱:{user1.email}")
else:
    print('用户未找到')

这里,如果User模型中存在name=’Alice’且email=’alice@example.com’的用户,则获得user1,并输出它的用户名和邮箱。否则,输出“用户未找到”。

实例二

考虑写一个视图函数,要根据请求参数获取一个Person实例,然后再返回该实例的信息。如果使用Django自带方法get_object_or_404(),可能会捕获到ObjectDoesNotExist异常。但是,如果使用get_or_none()则可以避免异常的捕获问题。

from django.http import HttpResponse
from django.shortcuts import get_or_none
from myapp.models import Person

def get_person(request):
    name = request.GET.get('name', None)
    person = get_or_none(Person, name=name)
    if person:
        response = f"姓名:{person.name} 年龄:{person.age} 个人资料:{person.info}"
    else:
        response = "无此用户"
    return HttpResponse(response)

这里,我们首先获取请求参数name的值,然后使用get_or_none()查询Person模型中相应的Person实例。如果存在,则返回它的个人资料;如果不存在,则返回”无此用户”。

综上所述,get_or_none()函数一般用于从ORM中查询指定模型实例,如果查询不到,它会返回None,避免了我们在视图函数等地方显式捕获ObjectDoesNotExist异常的繁琐工作。该函数的使用方法比较简单,可以根据实际需求做出相应的调整。