2016-08-26 1 views
0

Вот код, который строит QuerySet и печатает выход на каждом шаге (для отладки):Почему использование .latest() на пустой Django queryset return ... ничего?

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') печатает пустой, тип является пустым, если оператор игнорируется. Что тут происходит?

Пример, где результат не пустой 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) # [<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'> 
+1

Как вы испытали '.latest()' на пустом запросе возвращает 'None'. Итак, вы ожидали чего-то другого или каков ваш фактический вопрос? –

+0

Что такое 'qs.get_user' и' qs.completed'? Они не являются основными методами запросов. Кроме того, код, который вы опубликовали выше, переназначает переменную 'qs', чтобы быть другими, к тому времени, когда вы пытаетесь вызвать' qs.latest'. Я не думаю, что код будет работать вообще. Вы также упоминаете оператор if в своем вопросе - я не вижу его в коде. Пожалуйста, напишите [минимальный, проверяемый, полный пример] (http://stackoverflow.com/help/mcve). – solarissmoke

+0

@KlausD. он не возвращает None, если он не вернулся, он должен напечатать 'None', и он должен попасть в оператор if и напечатать« ничего », но он не делает ни одного из них. Я ожидал ничего, но не понял! – 43Tesseracts

ответ

2

From the documentation:

Как получить(), ранние() и last() raise DoNotExist, если нет объекта с заданными параметрами.

qs.latest('field') должен поднять Model.DoesNotExist исключения, когда qs является пустым QuerySet.

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

Проверьте исключение, которое не проглотило ваш взгляд/метод.

 Смежные вопросы

  • Нет связанных вопросов^_^