这里有一些构建查询集的代码,并在每一步打印输出(用于调试):
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'>
答案 0 :(得分:3)
每当与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。