Google app engine 我可以使用ndb.key处理重复属性或结构化属性吗

Google app engine 我可以使用ndb.key处理重复属性或结构化属性吗,google-app-engine,python-2.7,app-engine-ndb,Google App Engine,Python 2.7,App Engine Ndb,我试图使用一个键来处理重复的属性元素,比如:ndb.key('Books','Programming.one'),但是这个键(the.one部分)无效 下面的示例模型是我的应用程序模型的简化版本。在这个示例代码中,我在书籍章节和标记之间有依赖关系(使用键): class Tags(ndb.Model): tag = ndb.StringProperty() 示例:标记(id='python',tag='python') 示例:书籍(id='Programming',book='Prog

我试图使用一个键来处理重复的属性元素,比如:ndb.key('Books','Programming.one'),但是这个键(the.one部分)无效

下面的示例模型是我的应用程序模型的简化版本。在这个示例代码中,我在书籍章节和标记之间有依赖关系(使用键):

class Tags(ndb.Model):
    tag = ndb.StringProperty()
示例:标记(id='python',tag='python')

示例:书籍(id='Programming',book='Programming',chapters=['one','two'])

例如:

chapter_key = ndb.Key('Books','Programming.one')
dependency_key = ndb.Key('Dependencies', chapter_key.id())
Dependencies(key = dependency_key, chapter_key = chapter_key, 
                   tag_keys = [ndb.Key('Tags', 'python'), ndb.Key('Tags', 'java')])
是否可以使用ndb.Key对重复属性进行寻址。在我的代码示例中,chapter_键无效。我可以使用钩子或属性子类使其工作吗

为了让它工作,我可以将有效的Book键与StringProperty结合起来保存章节

book_key = ndb.Key('Books','Programming')
chapter = 'one'
dependency_key = ndb.Key('Dependencies', book_key.id() + '.' + chapter)
Dependencies(key = dependency_key, book_key = book_key, chapter = chapter, 
                   tag_keys = [ndb.Key('Tags', 'python'), ndb.Key('Tags', 'java')])
但我想从一把钥匙中获益

我对结构化财产也有同样的问题。对于此问题,重复的StringProperty章节将替换为重复的StructuredProperty,如:

class Chapters(ndb.Model):
    chapter = ndb.StringProperty()
    word_count = ndb.IntegerProperty()
关于我的示例和密钥的使用:

我在依赖项中使用键,因为依赖项中的键可以引用不同的类型。这些类型与书本类型不同,因为它们没有书本章节那样的重复属性。我在应用程序中使用重复的dependens\u\u键,而不是chapter\u键


在本例中,我还省略了父键。类似书本的类可以有依赖项,但在我的应用程序中,您无法找到依赖于类似书本的类的实体

我很好奇,因为上面的代码在sintax术语中似乎不正确:

tag_keys = [ndb.Key('Tags', 'python', ndb.Key('Tags', 'java']
你可以使用下面的代码,它对我有用:

class SomeModel(ndb.Model):
    pass


class WithKeys(ndb.Model):
    keys=ndb.KeyProperty(SomeModel,repeated=True)

keys=[ndb.Key(SomeModel,i) for i in range(1,10)]

with_keys=WithKeys(keys=keys)

print with_keys.keys
它打印:

[Key('SomeModel', 1), Key('SomeModel', 2), Key('SomeModel', 3), Key('SomeModel', 4), Key('SomeModel', 5), Key('SomeModel', 6), Key('SomeModel', 7), Key('SomeModel', 8), Key('SomeModel', 9)]

运气好

不,您不能使用密钥标识实体的一部分。如果要引用实体的一部分,则需要将密钥与您自己的方案结合使用,以寻址实体参数。

能否提供堆栈跟踪?所有这些都应该可以工作。当我在数据存储查看器中按owner_键时,会出现错误。我忘了在示例中键入一些右括号,谢谢。我不在KeyProperty中使用kind参数,因为在我的应用程序中,密钥可以引用不同的种类。如果删除该种类,它将以相同的方式工作,并且您可以将任何密钥分配给您的属性。我希望这对你有帮助。
class SomeModel(ndb.Model):
    pass


class WithKeys(ndb.Model):
    keys=ndb.KeyProperty(SomeModel,repeated=True)

keys=[ndb.Key(SomeModel,i) for i in range(1,10)]

with_keys=WithKeys(keys=keys)

print with_keys.keys
[Key('SomeModel', 1), Key('SomeModel', 2), Key('SomeModel', 3), Key('SomeModel', 4), Key('SomeModel', 5), Key('SomeModel', 6), Key('SomeModel', 7), Key('SomeModel', 8), Key('SomeModel', 9)]