【问题标题】:Django: testing get queryDjango:测试获取查询
【发布时间】:2010-03-26 16:43:44
【问题描述】:

好吧,我懒得写这个了……

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 个或 0 个匹配条目时,我想直接跳到那个条目,否则只得到一个“无”。在尝试将这些查询压缩到一行时,与 .get 一起出现的 DoesNotExist 错误并不总是那么有效。

有什么方法可以做到我所描述的吗?

【问题讨论】:

  • “与 .get 一起出现的 DoesNotExist 错误并不总是那么好用”? “试图将这些查询压缩成一行”? get 方法是标准方法。它出什么问题了?当您的 filter 示例也不是单行时,“单行”是什么意思?

标签: python django django-models django-queryset


【解决方案1】:

django-annoying 项目包含一个 get_object_or_None 快捷方式,尽管自己编写它很简单。

【讨论】:

    【解决方案2】:

    Create a custom 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-26
      • 2014-01-19
      • 2017-05-05
      • 2016-07-15
      • 2022-01-05
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      相关资源
      最近更新 更多