是否有任何Django函数可以让我从数据库中获取一个对象,如果没有匹配则有None?
现在我正在使用类似的东西:
foo = Foo.objects.filter(bar=baz)
foo = len(foo) > 0 and foo.get() or None
Run Code Online (Sandbox Code Playgroud)
但这不是很清楚,到处都是凌乱的.
Nic*_*ood 138
有两种方法可以做到这一点;
try:
foo = Foo.objects.get(bar=baz)
except model.DoesNotExist:
foo = None
Run Code Online (Sandbox Code Playgroud)
或者您可以使用包装器:
def get_or_none(model, *args, **kwargs):
try:
return model.objects.get(*args, **kwargs)
except model.DoesNotExist:
return None
Run Code Online (Sandbox Code Playgroud)
像这样称呼它
foo = get_or_none(Foo, baz=bar)
Run Code Online (Sandbox Code Playgroud)
Ces*_*ssa 87
在Django 1.6中,您可以使用first()Queryset方法.它返回查询集匹配的第一个对象,如果没有匹配的对象则返回None.
用法:
p = Article.objects.order_by('title', 'pub_date').first()
Run Code Online (Sandbox Code Playgroud)
kaa*_*orm 83
为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()
Run Code Online (Sandbox Code Playgroud)
现在我可以这样做:
bob_or_none = Person.objects.get_or_none(name='Bob')
Run Code Online (Sandbox Code Playgroud)
lla*_*aro 13
你也可以尝试使用django烦人(它有另一个有用的功能!)
安装它:
pip install django-annoying
from annoying.functions import get_object_or_None
get_object_or_None(Foo, bar=baz)
Run Code Online (Sandbox Code Playgroud)