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

  • Post category:Python

get_or_none()函数是 Django 模型 API 中的一个辅助函数,用于获取数据库中唯一一条数据或者返回 None。在使用 get() 函数时,如果查询结果为空或者存在多条记录,将会抛出异常,而 get_or_none() 函数则避免了这种情况。

get_or_none() 函数实现起来比较简单,其作用是查询数据库返回结果,如果查询结果为空,则返回 None,否则返回获取到的单个结果。实现代码如下:

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

使用方法

在 Django 模型 API 中使用 get_or_none() 函数,只需要导入该函数模块,然后在模型类中进行调用。示例代码如下:

from django.shortcuts import get_object_or_404
from django.urls import reverse
from django.http import Http404
from django.shortcuts import render
from myapp.models import MyModel
#...

def myview(request, my_model_id):
    my_model = get_or_none(MyModel, id=my_model_id)
    if my_model is None:
        raise Http404("MyModel does not exist")
    else:
        return render(request, 'my_template.html', {'my_model': my_model})

例子演示

假设有一个名为Person的模型,它有以下字段:nameageid。如果我们想要获取一个年龄为 18 岁的人,则可以使用 get_or_none()函数来实现。

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()

    def __str__(self):
        return self.name

现在我们假设数据库中有以下两条数据:

name     age
张三      20
李四      18
  • 例子1:
person = get_or_none(Person, age=18)

if person is None:
    print("未找到数据!")
else:
    print(str(person))

上述代码中,我们通过 get_or_none() 函数获取 age=18 的人,由于存在一条符合条件的记录,所以输出结果为 李四

  • 例子2:
person =get_or_none(Person, age=25)

if person is None:
    print("未找到数据!")
else:
    print(str(person))

在上述示例中,我们通过 get_or_none() 函数获取 age=25 的人,由于不存在符合条件的记录,所以输出结果为 未找到数据!

通过上面两个示例,我们可以看出 get_or_none() 函数的实用性,因为当我们需要获取一条数据时,如果使用 get() 函数,当数据库中没有符合条件的数据或者有多条符合条件的数据时,就会抛出异常。而使用 get_or_none() 函数则可以避免这种情况的发生,从而更加安全地获取数据。