使用ndb在另一种类型中多次引用单个Google数据存储区类型

时间:2017-02-27 13:56:19

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

我有以下2个ndb模型

from endpoints_proto_datastore.ndb import EndpointsModel

class Foo(EndpointsModel):
    attr1 = ndb.StringProperty(required=True)

class Bar(EndpointsModel):
    attr1 = ndb.KeyProperty('Foo', required=True)
    attr2 = ndb.KeyProperty('Foo', required=True)

如你所见,Bar有几个对Foo的引用。

现在,当我为每个引用分配值时,第二个替换第一个,只有它存储到db,最有趣的部分是当使用dev_appserver数据存储查看器查找时,属性名称为' Foo',而不是第二个属性的名字,取代了第一个。

插入后,这是我所期待的

Bar(key=Key('Bar', xxxxxxxxxxxxxxxx), attr1=Key('Foo', xxxxxxxxxxxxxxxx), attr2=Key('Foo', xxxxxxxxxxxxxxxx)

但我只能

Bar(key=Key('Bar', xxxxxxxxxxxxxxxxxx), attr2=Key('Foo', xxxxxxxxxxxxxxxx))

在数据存储区查看器中,

Entity Kind Bar

Entity Key  xxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

ID          xxxxxxxxxxxxxxxx


Foo (Key)   xxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Foo: id=xxxxxxxxxxxxxxxx

1 个答案:

答案 0 :(得分:3)

KeyProperty的第一个参数是属性的名称(如果您希望名称与class-property不同),因此使用相同的名称两次将产生您所看到的行为。

您应该使用命名参数来指定类型:

ndb.KeyProperty(kind='Foo', required=True)