2016-01-24 18 views
0

我現在有一個活動(db.Model)類,如下所示:如何更新GoogleAppEngine for Python中的StringListProperty?

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() 

我已經創建了導出將被附加到這個StringListProperty一個事件的名稱的HTML文件。我希望爲特定用戶更新此StringListProperty,而不是編輯任何其他屬性。據我所知,有從實體查詢特定用戶名的方法:

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

我可能使用此更新signedevents屬性,用於特定的用戶。但是,我覺得這是非常低效的,而且很可能是無效的。更新現有用戶的StringListProperty的最佳方式是什麼?

回答

0

這不可能使用數據存儲。

您已獲得實體。更新該實體的特定StringList屬性並將整個實體寫回數據存儲。

事實上,你認爲它效率低下,不會改變數據存儲如何工作的事實。

現在,如果這個實體很大(很多屬性和索引),而您上面包含的模型不是,並且您有很多更新,那麼可以考慮將模型分爲頻繁更新和不常更新零件,或經常使用和不常使用的屬性。

0

首先,我會建議使用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。