为什么在空的 Django 查询集 return 上使用 .latest()...什么都没有?

Why does using .latest() on an empty Django queryset return...nothing?

下面是一些构建查询集并在每一步打印输出(用于调试)的代码:

qs = self.get_queryset(True)
print(qs)  #   [<MyModel: obj_1>, <MyModel: obj_2>, <MyModel: obj_2>, <MyModel: obj_3>]
qs = qs.get_user(user)
print(qs)  # []
qs = qs.completed()
print(qs)  # []
qs = qs.latest('time_completed')
print(qs)  #    <-- What happened?  Why is this blank?
print(qs is None) # False <-- huh??
print("nothing") if not qs else print("something") #   <-- blank?!?! how?!
print(type(qs)) # 

最后一个操作qs.latest('time_completed')打印空白,类型为空白,忽略if语句。这是怎么回事?

结果不是空查询集的示例工作正常(注意所有项目都是单个用户,只是巧合):

qs = self.get_queryset(True)
print(qs)  #  [<MyModel: obj_1>, <MyModel: obj_2>, <MyModel: obj_2>, <MyModel: obj_3>]
qs = qs.get_user(user)
print(qs)  #  [<MyModel: obj_1>, <MyModel: obj_2>, <MyModel: obj_2>, <MyModel: obj_3>]
qs = qs.completed()
print(qs)  #  [<MyModel: obj_1>, <MyModel: obj_2>, <MyModel: obj_2>, <MyModel: obj_3>]
qs = qs.latest('time_completed')
print(qs)  #  obj_1
print("nothing") if not qs else print("something") # something
print(type(qs)) # <class 'my_app.models.MyModel'>

From the documentation:

Like get(), earliest() and latest() raise DoesNotExist if there is no object with the given parameters.

只要 qs 是空查询集,

qs.latest('field') 就应该引发 Model.DoesNotExist 异常。

In [2]: Entity.objects.none().latest('creation_date')
---------------------------------------------------------------------------
DoesNotExist                              Traceback (most recent call last)

检查您的 view/method.

中的异常是否被吞噬

如果您希望它 return None 而不是抛出错误,您可以使用 order_by()last().

qs.order_by('time_completed').last()

如果查询集为空,这将 return None。