Django:从数据库获取对象,若无匹配则返回'None

109 投票
8 回答
68570 浏览
提问于 2025-04-15 14:45

有没有什么Django的函数可以让我从数据库中获取一个对象,如果没有找到就返回None?

现在我用的是类似这样的代码:

foo = Foo.objects.filter(bar=baz)
foo = len(foo) > 0 and foo.get() or None

但是这样写起来不太清楚,而且到处都是这种代码看起来很乱。

8 个回答

84

为了给sorki的回答增加一些示例代码(我本来想作为评论添加,但这是我第一次发帖,声望不够,不能评论),我实现了一个叫做get_or_none的自定义管理器,代码如下:

from django.db import models

class GetOrNoneManager(models.Manager):
    """Adds get_or_none method to objects
    """
    def get_or_none(self, **kwargs):
        try:
            return self.get(**kwargs)
        except self.model.DoesNotExist:
            return None

class Person(models.Model):
    name = models.CharField(max_length=255)
    objects = GetOrNoneManager()

现在我可以这样使用它:

bob_or_none = Person.objects.get_or_none(name='Bob')
149

有两种方法可以做到这一点;

try:
    foo = Foo.objects.get(bar=baz)
except model.DoesNotExist:
    foo = None

或者你可以使用一个包装器:

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

这样调用它:

foo = get_or_none(Foo, baz=bar)
94

在Django 1.6中,你可以使用 first() 这个查询集方法。它会返回查询集中匹配到的第一个对象,如果没有找到匹配的对象,就返回None。

用法:

p = Article.objects.order_by('title', 'pub_date').first()

撰写回答