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

时间:2016-08-26 04:30:57

标签: python django django-queryset

这里有一些构建查询集的代码,并在每一步打印输出(用于调试):

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'>

2 个答案:

答案 0 :(得分:3)

From the documentation

  

与get()类似,如果没有具有给定参数的对象,则earliest()和latest()会引发DoesNotExist。

每当qs.latest('field')为空查询集时,

Model.DoesNotExist都会引发qs异常。

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

检查视图/方法中是否未吞下异常。

答案 1 :(得分:0)

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

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

如果查询集为空,则将返回None。