【问题标题】:Adding dynamic properties to datastore object向数据存储对象添加动态属性
【发布时间】:2013-01-25 08:21:13
【问题描述】:

我对 Python 比较陌生,来自 PHP 世界。在 PHP 中,我会例行地获取一行,该行对应于数据库中的对象,比如用户,并在将用户对象传递给我的视图页面之前为其添加属性。 例如,用户具有属性 email、name 和 id。 我从数据库中获取了 5 个用户,并在 for 循环中为用户分配了一个动态属性,比如 image。

这似乎不适用于 for 循环中的 Python/Google App Engine 数据存储模型(我认为它对数据存储模型的作用比 python 更多)。它在 for 循环中工作(这意味着我可以在 for 循环中引用 user.image,但是一旦 for 循环结束,所有对象似乎都不再具有新的属性 image。

这是一个代码示例:

# Model
Class User(ndb.Model):
   email = ndb.StringProperty()
   name = ndb.StringProperty()


# And then a function that returns a list of users
users = User.get_users()

user_list = []
# For loop 
for user in user:
   # For example, get image
   user.image = Image.get_image(user.key)
   user_list.append(user)

   # If I print or log this user in the for loop, I see a result
   logging.info(user.image) # WORKS!

for ul in user_list:
   print ul.image # Results in None/ATTR Error

谁能向我解释为什么会发生这种情况以及如何实现这个目标?

我已经搜索了表格,但找不到任何东西。

【问题讨论】:

  • 这绝对可以。你确定这是准确的代码吗?您在第一个和第二个循环之间没有做任何可能导致从数据存储区重新获取实例的操作?
  • get_users() 可能是一个查询,在这种情况下,第二个循环将重新获取没有动态属性的用户。
  • 丹尼尔,你是对的!我的错误伙计们,我正在打印整个对象,出于某种原因(也许你可以解释一下),只打印出原始属性。但是,如果我像上面那样直接调用动态属性(打印 ul.image),它就可以工作。对不起!

标签: python google-app-engine properties


【解决方案1】:

尝试使用Expando Model

有时您不想提前声明您的属性。一种 特殊模型子类 Expando 改变其实体的行为 以便分配的任何属性(只要它不以 下划线)保存到数据存储区。

【讨论】:

  • 谢谢,Shay 这是一个可能的解决方案,也许最终会成为最好的解决方案。但是,我对 Expando 类的理解更多是用于将动态属性放入数据存储区,而不是添加用于在视图页面上显示的属性,对吧?
  • 我试图避免将 Expando 用于从数据存储角度来看不需要它的类(以避免意外将属性放置到不应该具有它们的实体的风险)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2015-12-12
  • 2017-05-26
  • 1970-01-01
相关资源
最近更新 更多