【问题标题】:Can I address a repeated property or a structured property using a ndb.key我可以使用 ndb.key 处理重复属性或结构化属性吗
【发布时间】:2013-01-16 15:59:09
【问题描述】:

我尝试使用键来处理重复的属性元素,例如:ndb.Key('Books', 'Programming.one') 但此键(.one 部分)无效。

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

class Tags(ndb.Model):
    tag = ndb.StringProperty()

示例:标签(id = 'python', tag = 'python')

class Books(ndb.Model):
    book = ndb.StringProperty)
    chapters = ndb.StringProperty(repeated = True)

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

class Dependencies(ndb.Model):
    chapter_key = ndb.KeyProperty()
    tag_keys = ndb.KeyProperty(repeated = True)

例子:

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_key 无效。我可以使用钩子或属性子类使其工作吗?

为了使它工作,我可以将有效的书本密钥与 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()

关于我的例子和按键的使用:

我在依赖项中使用键,因为依赖项中的键可以引用不同的类型。这些种类不同于 Book like 种类,因为它们没有像 Book chapters 这样的重复属性。我在我的应用程序中使用重复的depends_on_keys,而不是chapter_keys。

在示例中,我还省略了父键。 Book like kind 可以有依赖关系,但在我的应用程序中,您找不到实体,这些实体依赖于 Book like kind。

【问题讨论】:

标签: google-app-engine python-2.7 app-engine-ndb


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我很好奇,因为上面的代码在 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)]
    

    祝你好运

    【讨论】:

    • 我忘记在示例中输入一些右括号,谢谢。我不在 KeyProperty 中使用 kind 参数,因为在我的应用中,键可以引用不同的种类。
    • 如果您删除该类型,它将以相同的方式工作,您将能够为您的属性分配任何密钥。希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2010-11-27
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 2013-05-21
    相关资源
    最近更新 更多