【问题标题】:Python Google AppEngine: Set value for "Key Name" of an entity via JSON filePython Google AppEngine:通过JSON文件为实体的“键名”设置值
【发布时间】:2014-11-22 16:45:00
【问题描述】:

我正在构建一个 GAE Web 应用程序,它通过 HTTP POST 接收 JSON 文件并将数据保存到应用程序的数据存储中。

我能够使用以下代码将传入的 JSON 文件解析为我的 NDB 模型类:

jsonContent = json.loads(self.request.body)
myTransaction = Transaction()
myTransaction.populate(**jsonContent)
myTransaction.put()

这是 JSON 文件的内容:

{"name": "Fabio", "message": "Hello World!"}

我面临的挑战是,此 JSON 还应包含一个 ID 值,该 ID 值将存储在数据存储实体的“键名”列中。我尝试将 "key_name":"1" 或 "id":"1" 添加到 JSON 文件,但 populate() 方法不将它们理解为有效属性。相反,当第一次实例化 myTransaction 对象时,我必须按照惯例将构造函数设置为 Transaction(id="1")。但是,属性 ID 的内容与其余数据一起存储在 JSON 文件中。在调用 populate() 之前以编程方式实际打开 JSON 以检索每个 ID 并设置构造函数是没有任何意义的。事实上,这甚至不起作用,因为 populate() 仍然会尝试解析 JSON 文件中的属性 ID。

有谁知道如何将包含“Key Name”属性的 JSON 文件解析到 NDB 模型类并将其持久化到应用程序的数据存储中?

【问题讨论】:

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


    【解决方案1】:

    在您put() 之前,该密钥不存在。如果您需要将密钥作为 JSON 对象的一部分,您可以附加它:

    the_key = myTransaction.put()
    the_id = the_key.id()
    jsonContent['the_id'] = the_id
    

    ndb 和 db 是不同的。 ndb 不使用key_name

    db: MyModel(key_name='my_key')
    ndb: MyModel(id='my_key')
    

    您可以在填充后插入您的自定义 ID,如下所示:

    myTransaction["id"] = the_id
    myTransaction.put()
    

    【讨论】:

    • 感谢您的回答。我实际上指的是Key Name,而不是插入数据后生成的Key。
    • 您描述的方法的问题是 ID(Key Name) 嵌入到由 populate() 方法处理的 JSON 中。我想避免手动解码 JSON 文件以找出 ID 的值,然后在执行 populate() 后将其分配给对象。不过,不确定这是否可行。
    • 这个主题的答案可能与我所说的有关,但我没有适当的知识将解决方案与我的需求联系起来:stackoverflow.com/questions/13311363/…“可能值得注意的是to_dict 不包含模型中的键。因此您可能希望执行类似 json.dumps([dict(p.to_dict(), **dict(id=p.key.id())) for p in 的操作。 .. – 布赖恩 M. 洪"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 2021-06-16
    相关资源
    最近更新 更多