【问题标题】:Model.objects.get() or NoneModel.objects.get() 或无
【发布时间】:2012-06-07 16:33:32
【问题描述】:

有没有办法一次性完成以下任务:

Model.objects.get(id=1) else None

我找到的唯一方法是这样做:

try:
    object = Model...
except:
    object = None

有没有办法在 django 的一次调用中做到这一点?

更新:除了try/except 块之外,似乎没有其他方法可以做到这一点,但这里有一个更好的答案:In Django, how do I objects.get, but return None when nothing is found?

【问题讨论】:

  • 好吧,看来你已经解决了你的问题。作为一个附加参数,使用 try: ... except(使用特定异常)在 Python 中被认为是一种很好的做法(更不用说 Django,它或多或少遵循相同的理念)。
  • (Model.objects.filter(pk=1) or [None])[0] 不太明确,但有时也很有用。
  • 我不太喜欢它是一个未命名的例外。这里涉及到的具体Exception 子类是什么?
  • 它是YourModel.DoesNotExistFooBar.DoesNotExist

标签: django django-models


【解决方案1】:

如果你在一个网络请求中使用它,并且你想在对象不存在的情况下返回 404,也许你应该使用

get_object_or_404(Mode, pk=1)

【讨论】:

    【解决方案2】:

    get_object_or_404

    在你的模型中做 . . .

    @models.permalink
    def get_absolute_url(self):
        return "/blog/%s/" self.slug
    

    【讨论】:

      【解决方案3】:

      这个怎么样:

      obj = Model.objects.filter(id=1).first()
      

      现在如果不存在 id=1 的对象,obj 将是 None

      参考:https://docs.djangoproject.com/en/3.2/ref/models/querysets/#django.db.models.query.QuerySet.first

      【讨论】:

      • 请注意,这不是一回事,因为get 会在找到多个匹配项时出错,而这只会返回第一个匹配项。
      猜你喜欢
      • 1970-01-01
      • 2012-10-08
      • 2021-09-03
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      相关资源
      最近更新 更多