【问题标题】:Appengine ndb dynamic choicesAppengine ndb 动态选择
【发布时间】:2026-02-11 23:20:07
【问题描述】:

如何在 Google APpengine ndb 中实现动态选择?

class Choice(ndb.Model):
    name = ndb.StringProperty()

class List(ndb.Model):
    choices = ndb.KeyProperty(Choice, choices=Choice.query(keys_only=True).fetch(), repeated=True)

此代码以TypeError: __init__() got an unexpected keyword argument 'keys_only' 退出。

【问题讨论】:

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


    【解决方案1】:

    您的代码中有一个错字导致您提到的错误:

    (keys-only=True)

    应该是

    (keys_only=True)

    此外,该参数需要传递给.fetch(),而不是.query()

    choices=Choice.query().fetch(keys_only=True)

    但不管怎样,以这种方式获取选项列表是不可能的,在 ndb 模型定义级别定义它不能是动态的。

    您可以在应用程序级别实现它,获取可用选项列表并在.put() 之前对照该列表检查添加到choices 属性的值。如果您需要以事务方式执行此操作,可能会有点棘手,因为您无法在事务中进行(非祖先)查询。为了解决类似的问题,我使用 memcache 存储通过查询(在事务之外)获得的选择列表,并在事务内部从那里获取它。

    【讨论】:

    • 谢谢,已修复。现在错误是TypeError: __init__() got an unexpected keyword argument 'keys_only'...
    • @user2154587 你应该将keys_only 参数传递给fetch() 函数而不是query() 一个。
    • 另外,你想做什么?最后一行似乎没有多大意义。