Django:从数据库获取对象,若无匹配则返回'None
有没有什么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()