Попробуйте реструктурировать свой код так, чтобы вы получали по ключу (который всегда дает вам самые последние данные), а не выполнял запрос. Я понимаю, что это не всегда возможно, но я приведу вам недавний пример того, что сработало для меня.
У меня есть панель управления пользователя, где пользователь может создавать и удалять «элементы». Мои сущности выглядели так:
class User(ndb.Model)
...
class Item(ndb.Model)
user = ndb.KeyProperty(User, required=True)
Раньше я делал такой запрос при ответе на запрос GET для пользовательской панели.
items = Item.query(user=user.key)
Это был плохой опыт, потому что пользователь удалял элемент, и после POST/redirect/GET только что удаленный элемент снова появлялся на панели инструментов из-за возможной согласованности.
Чтобы исправить это, я изменил свою сущность пользователя, чтобы иметь список элементов, подобных этому:
class User(ndb.Model)
items = ndb.KeyProperty(repeated=True)
...
Теперь, когда я показываю панель инструментов, я делаю это:
items = ndb.get_multi(user.items)
Так как я сейчас получаю по ключу, данные всегда актуальны.
Это работает для меня, потому что у пользователя не будет так много элементов. Однако если бы пользователь мог иметь тысячи элементов, этот подход не работал бы из-за ограничения размера объекта.
person
gaefan
schedule
15.01.2016