Как установить родительский объект в качестве свойства? - PullRequest
2 голосов
/ 30 августа 2011

я хочу сделать что-то вроде этого:

e = Employee(key_name = 'john',name='john the first')
e.put()
a = Address(key_name='addr_john',street='66th street')
a.parent = e;
a.put();

addr = Address.gql("WHERE ANCESTOR IS :1", e).fetch(1) #len(addr)==0

Но это не работает, это работает, только если я устанавливаю родителя в конструкторе.

a = Address(key_name='addr_john',street='66th street',parent=e)

Но я не хочу этого делать, мне нужно это сделать после создания объекта.

1 Ответ

4 голосов
/ 30 августа 2011

Родитель для сущности может быть установлен только во время его создания, поэтому только в конструкторе db.Model экземпляра подкласса. Попытка присвоить атрибуту parent экземпляра db.Model приведет к перезаписи его функции parent(), но фактический родительский элемент для соответствующей сущности хранилища данных не будет изменен.

Если у вас есть отношения, которые невозможно установить во время создания дочернего объекта, вам следует рассмотреть возможность его кодирования как обычного свойства. В качестве альтернативы (если вы не можете позволить себе не иметь отношения родитель-потомок из-за нужных вам транзакций), вы можете попытаться отложить создание дочернего объекта до тех пор, пока не сможете определить, какой родитель должен иметь его. Поскольку очевидно, что вы также используете родительские данные (то есть name из Employee), чтобы установить key_name для дочерней сущности, этот подход, кажется, имеет смысл. (Имена ключей, как и родители, также могут быть установлены только при создании сущности).

...