2015-06-22 9 views
0

Я пытаюсь получить запись из хранилища данных Google App Engine, с помощью метода filter() следующим образом:Google App Engine: фильтр()

result = Sender.all().filter("email =", email).filter("source_address =", source).filter("dest_address =", dest).filter("food_type =", food_type) 

Тогда, если такая запись существует, то изменить значение одного из столбцов в этой записи. В противном случае появляется сообщение об ошибке.

 if result: 
      for e in result: 
       e.time_of_delivery = toj 
       e.put() 
       self.response.write("Time of delivery successfully rescheduled !") 
     else: 
      self.response.write("No such request.") 

Однако, даже если запись в хранилище данных не существует на основании условий, налагаемых filter() методы, которые я использовал, никогда не отображается No such request. сообщение. Вместо этого все, что я получаю, - это пустая страница.

Что именно не так с моим кодом? Почему часть кода else никогда не выполняется, когда запись не найдена в хранилище данных, то есть когда result = None?

ответ

1

object.__nonzero__:

Вызывается для реализации тестирования значения истинности и встроенная операция bool(); должен возвращать значение False или True или их целочисленные эквиваленты 0 или 1. Если этот метод не определен, вызывается __len__(), если он определен, и объект считается истинным, если его результат отличен от нуля. Если класс не определяет ни __len__(), ни __nonzero__(), все его экземпляры считаются истинными.

кажется, что GAE Query не реализует ни __nonzero__ или __len__ так лучший способ проверить это:

if result.count(limit=1): # retrieves only 1 record 
    # results exist 
else: 
    # results don't exist 
+0

Это работает отлично. Благодаря ! –

+2

Это довольно неэффективно. Вызов .count() - это, по сути, такая же стоимость, как и запрос. – Greg

+1

Очень неэффективно, поскольку запрос будет выполняться дважды. –

-1

Что говорят журналы сервера разработки App Engine? Ваш запрос выглядит как запрос хранилища старого стиля, а не ndb, поэтому у вас может быть неправильный синтаксис, и код генерирует исключение перед отправкой любого ответа.

+0

Журналы не показывают ошибки в своем коде. –

2

Объект запроса всегда будет решать верно, как в ответ ранее ..

Запрос не выполняется, пока вы не подсчитаете, не перейдете, не получите или не получите результат.

Я хотел бы сделать что-то больше похоже на

has_result = False 
    for e in results: 
     e.time_of_delivery = toj 
     e.put() 
     self.response.write("Time of delivery successfully rescheduled !") 
     has_result = True 
    if not has_result: 
     self.response.write("No such request.")