Почему put () не работает при использовании с индексированным элементом в Query? - PullRequest
0 голосов
/ 05 октября 2011

У меня проблема с тем, что put() не работает, если я получаю доступ к классу модели как к индексируемому члену Query напрямую; однако, когда я явно извлекаю класс из Query, он, кажется, работает нормально. Почему это?

Этот код работает:

class Record:
   field = db.StringProperty()

rs = Record.all().filter('name = ', name_str)
if rs.count() == 1:
   # assume that we only get one record in return...
   r = rs[0]
   r.field = some_value
   r.put()

и этот код не (и не вызывает ошибок)

class Record:
   field = db.StringProperty()

rs = Record.all().filter('name = ', name_str)
if rs.count() == 1:
   # assume that we only get one record in return...
   rs[0].field = some_value
   rs[0].put()

1 Ответ

4 голосов
/ 06 октября 2011

Каждый раз, когда вы индексируете запрос, подобный этому, он выполняет запрос заново, извлекает соответствующий результат, декодирует его и возвращает вам. Во втором фрагменте вы изменяете один экземпляр сущности, немедленно отбрасываете его, затем извлекаете и сохраняете (неизменяемый) вторую копию.

Как правило, вам следует избегать индексации запросов, подобных этому, - вместо этого вызывайте .get() или .fetch().

По той же причине вам следует избегать использования .count(), где это возможно, так как это также требует выполнения другого запроса. Если вам нужен только один результат, позвоните .get(); если вам нужно больше, позвоните .fetch(), а затем посчитайте количество полученных результатов.

...