【问题标题】:Dynamically setting a property in ndb object在 ndb 对象中动态设置属性
【发布时间】:2023-03-12 23:50:01
【问题描述】:

在我基于 GAE 的网络应用程序中,我加载了一个 NDB 实体并尝试对其进行编辑。但问题是我要编辑的字段是由字符串动态决定的,所以我无法对其进行硬编码。

我尝试了这些方法,但都没有成功

obj[fieldName] = newValue
obj.populate(fieldName,newValue)
obj.populate(Modlue._properties[fieldName] = newValue) #keyword can't be an expression
setattr(obj, fieldName,newValue) #value not being set

必须有一些正确的语法才能做到这一点。有人可以帮我解决这个问题吗

【问题讨论】:

  • 最后一个是正确的。您如何验证该值没有被设置?
  • 您也可以使用 populate 但传递字典。 obj.populate(**{fieldname:newValue}) as populate 采用一组与属性相对应的命名参数。
  • @DanielRoseman 感谢您的帮助。最后一个确实有效
  • 不同之处在于如果 fieldName 不是模型的定义属性, setattr(...) 只是设置一个本地(非持久)属性,而 populate(**...) 给出你是一个有用的错误。
  • **setattr 函数在实体中静态分配属性。但是您正在使用设置动态属性转到link

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


【解决方案1】:

您正在寻找的是Expando class

您可以在模型类中安全地将ndb.Model 替换为ndb.Expando,您的持久化实体仍然可以完美使用。

注意:但是,反之亦然;如果您尝试操作(获取/放置)具有未在其类中声明的属性的 ndb.Model 实体,ndb 将崩溃。

【讨论】:

    最近更新 更多