如何为 Python 更新 GoogleAppEngine 中的 StringListProperty?
How can one update a StringListProperty in GoogleAppEngine for Python?
我目前有一个活动(db.Model)class,如下所示:
class User(db.Model):
name = db.StringProperty(required = True)
pw_hash = db.StringProperty(required = True)
email = db.EmailProperty(required = True)
position = db.StringProperty(required = True)
signedevents = db.StringListProperty()
我创建了一个 HTML 文件,该文件导出将附加到此 StringList属性 的事件的名称。我希望为特定用户更新此 StringList属性,而不编辑任何其他属性。我知道有一种从实体查询特定用户名的方法:
signeduser = db.GqlQuery("SELECT * FROM User WHERE username=self.username")
我可能会使用它来更新该特定用户的 signedevents 属性。但是,我觉得这是非常低效的,而且很可能是无效的。为现有用户更新 StringList属性 的最佳方法是什么?
使用数据存储无法做到这一点。
您已获得实体。更新该实体的特定 StringList 属性 并将整个实体写回数据存储区。
您认为它效率低下这一事实不会改变数据存储区工作方式的事实。
现在,如果这个实体很大(很多属性和索引),而您上面包含的模型不是,并且您有很多更新,那么您可以考虑将模型拆分为经常更新和不经常更新更新的部分,或常用与不常用的属性。
首先,我建议您对模型使用 ndb
而不是 db
。它将使用内存缓存将实体保存在内存中,同时在后台写入数据存储。后续请求(按键)会更快。
其次,利用 Property Options 提高数据存储写入效率:
class User(ndb.Model):
name = ndb.StringProperty('n', required = True)
pw_hash = ndb.StringProperty('h', required = True, indexed = False)
email = ndb.EmailProperty('e', required = True, indexed = False)
position = ndb.StringProperty('p', required = True, indexed = False)
signedevents = ndb.StringListProperty('e', indexed = False)
使用第一个参数指定 属性 在数据存储中的名称,并添加 indexed = False
以避免在每次写入时更新额外的索引(当然,除非您需要索引)。
第三,也许使用@timhoffman 的建议将经常更新的值拆分到另一个实体中。在 User
和 SignedEvents
之间创建 one-to-one 关系并独立更新 StringListProperty。
我目前有一个活动(db.Model)class,如下所示:
class User(db.Model):
name = db.StringProperty(required = True)
pw_hash = db.StringProperty(required = True)
email = db.EmailProperty(required = True)
position = db.StringProperty(required = True)
signedevents = db.StringListProperty()
我创建了一个 HTML 文件,该文件导出将附加到此 StringList属性 的事件的名称。我希望为特定用户更新此 StringList属性,而不编辑任何其他属性。我知道有一种从实体查询特定用户名的方法:
signeduser = db.GqlQuery("SELECT * FROM User WHERE username=self.username")
我可能会使用它来更新该特定用户的 signedevents 属性。但是,我觉得这是非常低效的,而且很可能是无效的。为现有用户更新 StringList属性 的最佳方法是什么?
使用数据存储无法做到这一点。
您已获得实体。更新该实体的特定 StringList 属性 并将整个实体写回数据存储区。
您认为它效率低下这一事实不会改变数据存储区工作方式的事实。
现在,如果这个实体很大(很多属性和索引),而您上面包含的模型不是,并且您有很多更新,那么您可以考虑将模型拆分为经常更新和不经常更新更新的部分,或常用与不常用的属性。
首先,我建议您对模型使用 ndb
而不是 db
。它将使用内存缓存将实体保存在内存中,同时在后台写入数据存储。后续请求(按键)会更快。
其次,利用 Property Options 提高数据存储写入效率:
class User(ndb.Model):
name = ndb.StringProperty('n', required = True)
pw_hash = ndb.StringProperty('h', required = True, indexed = False)
email = ndb.EmailProperty('e', required = True, indexed = False)
position = ndb.StringProperty('p', required = True, indexed = False)
signedevents = ndb.StringListProperty('e', indexed = False)
使用第一个参数指定 属性 在数据存储中的名称,并添加 indexed = False
以避免在每次写入时更新额外的索引(当然,除非您需要索引)。
第三,也许使用@timhoffman 的建议将经常更新的值拆分到另一个实体中。在 User
和 SignedEvents
之间创建 one-to-one 关系并独立更新 StringListProperty。