如何将实体的父级设置为属性?

时间:2011-08-30 12:54:01

标签: python google-app-engine google-cloud-datastore

我想做这样的事情:

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 个答案:

答案 0 :(得分:4)

实体的父级只能在创建期间设置,因此只能在db.Model子类实例的构造函数中设置。尝试分配parent实例的db.Model属性将导致其parent()函数被覆盖,但相应数据存储区实体的实际父级将不会更改。

如果您在创建子对象期间存在无法建立的关系,则应考虑将其编码为普通属性。 或者(如果由于您需要的事务而无法承担父子关系),您可以尝试推迟创建子对象,直到您可以确定它应该具有哪个父对象。由于您显然也使用父数据(即name的{​​{1}})为子实体建立Employee,因此这种方法似乎有意义。 (关键名称,如父母,也可以仅在实体创建期间设置)。