appengine: как я могу проверить, существует ли свойство из сущности в хранилище данных? - PullRequest
2 голосов
/ 06 июля 2011

Я знаю, что невозможно запросить в хранилище данных отсутствующие значения (см. Этот вопрос ).

А как насчет кода Python? Можно ли проверить, получено ли значение из свойства объекта из хранилища данных или из значения по умолчанию?

Вариант использования:

Модель Kind_X имеет 1000 объектов. Для свойства Kind_X.my_property .

  • 500 объектов не имеют my_property
  • 400 сущностей my_property Нет
  • 100 объектов являются другими значениями

Я бы хотел установить my_property на ABC только для тех 500 объектов, у которых нет этого свойства. 400 сущностей со значением None не могут быть изменены.

Примечание: установка my_property по умолчанию как ABC не является приемлемым решением.

Ответы [ 4 ]

0 голосов
/ 16 июля 2011
from google.appengine.api import datastore

entity_key = 'ag1lbmdlbG1pbmFzd2VicgoLEgRVc2VyGGIM' 
entity = datastore.Get(entity_key)
print 'my_property' in entity
0 голосов
/ 07 июля 2011

Невозможно сделать это, используя высокоуровневую инфраструктуру ext.db.Вы можете получить данные, используя google.appengine.api.datastore каркас нижнего уровня (документация находится в строках документации).

Почему вам необходимо различать эти два случая?Может быть, есть лучший подход.

0 голосов
/ 08 июля 2011

Если у вас нет большого количества данных, вы можете уменьшить карту и сохранить ключи сущностей, которые вам нужны, в новой модели, в которой только ListProperty содержит ключи. Это своего рода грязный хак и работает только для менее чем 5k сущностей. Он также создает много метаданных, поэтому будьте осторожны

0 голосов
/ 07 июля 2011

Вы можете перебрать все сущности данного вида и проверить это программно с помощью:

entities = Model.all()
for entity in entities :
  if not entity.newproperty :
    print "Hey, this entity is missing something"

Если число сущностей велико, вы должны использовать библиотеку mapreduce , чтобыизбежать тайм-аута.

...