Django:测试 GET 查询
好吧,我真是受够了写这个了...
res = Something.objects.filter(asdf=something)
if res:
single = res[0]
else:
single = None
if single:
# do some stuff
我更希望能这样做:
single = Something.objects.filter(asdf=something)
if single:
#do some stuff
我想要能够直接获取一个单一的对象,而不需要去检查过滤后的结果。
换句话说,当我知道结果中要么有1个,要么没有匹配的条目时,我希望能直接找到那个条目,否则就返回'None'。使用.get方法时,出现的DoesNotExist错误在我想把这些查询压缩成一行时并不总是很好用。
有没有办法做到我所描述的这个?
2 个回答
3
django-annoying这个项目里有一个叫做get_object_or_None
的快捷方式,可以实现这个功能,不过其实自己写一个也很简单。
2
你可以创建一个自定义的 Manager
,把你觉得烦的重复代码封装成一个方法(给它起个比下面更好的名字),或者你也可以写一个工具函数,做同样的事情,这样就不用修改模型定义了:
class MyManager(models.Manager):
def get_or_none(self, **kwargs):
try:
return self.get(**kwargs)
except self.model.DoesNotExist:
return None
class MyModel(models.Model):
objects = MyManager()
使用方法:
MyModel.objects.get_or_none(asdf=something)