Django:测试 GET 查询

0 投票
2 回答
527 浏览
提问于 2025-04-15 20:53

好吧,我真是受够了写这个了...

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)

撰写回答