我想做这样的事情:
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)
但我不想这样做,我需要在创建对象后这样做。
答案 0 :(得分:4)
实体的父级只能在创建期间设置,因此只能在db.Model
子类实例的构造函数中设置。尝试分配parent
实例的db.Model
属性将导致其parent()
函数被覆盖,但相应数据存储区实体的实际父级将不会更改。
如果您在创建子对象期间存在无法建立的关系,则应考虑将其编码为普通属性。
或者(如果由于您需要的事务而无法承担父子关系),您可以尝试推迟创建子对象,直到您可以确定它应该具有哪个父对象。由于您显然也使用父数据(即name
的{{1}})为子实体建立Employee
,因此这种方法似乎有意义。 (关键名称,如父母,也可以仅在实体创建期间设置)。