【问题标题】:How can one update a StringListProperty in GoogleAppEngine for Python?如何在 GoogleAppEngine for Python 中更新 StringListProperty?
【发布时间】:2016-01-24 08:49:18
【问题描述】:

我目前有一个 Events(db.Model) 类,如下所示:

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 文件,该文件派生了将附加到此 StringListProperty 的事件名称。我希望为特定用户更新此 StringListProperty,而不是编辑任何其他属性。我知道有一种从实体中查询特定用户名的方法:

signeduser = db.GqlQuery("SELECT * FROM User WHERE username=self.username")

我可能会使用它来更新该特定用户的 signedevents 属性。但是,我觉得这是非常低效的,而且很可能是无效的。为现有用户更新 StringListProperty 的最佳方法是什么?

【问题讨论】:

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


    【解决方案1】:

    使用数据存储无法做到这一点。

    你已经得到了实体。更新该实体的特定 StringList 属性并将整个实体写回数据存储区。

    您认为它效率低下的事实不会改变数据存储的工作方式这一事实。

    现在,如果这个实体很大(很多属性和索引),而您上面包含的模型不是,并且您有很多更新,那么您可能会考虑将模型拆分为经常更新和不经常更新的部分,或者常用的和不常用的属性。

    【讨论】:

      【解决方案2】:

      首先,我建议您的模型使用ndb 而不是db。它将使用 memcache 将实体保存在内存中,同时在后台写入数据存储。后续请求(按键)会更快。

      其次,利用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 的建议将经常更新的值拆分到另一个实体中。在UserSignedEvents 之间创建一对一的关系,并独立更新 StringListProperty。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-20
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 2020-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多