0

我正在構建一個App Engine的同步引擎,當我從客戶端接收數據時,我想存儲一個對象,但我不在乎它是否已經存在。如果我在更新時總是從客戶端發送所有屬性,它今天工作的很好。但我想...部分更新App Engine實體

  • 一些內部屬性不被客戶知道,仍然生存的更新
  • 客戶端可以只發送更改後的值
  • 避免更新之前獲取的所有對象他們因爲可以有很少的對象需要更新

我是否需要獲取每個對象,然後只更新我想更改的值,然後更新對象?或者是否有可能部分更新實體而不提取它們?

回答

2

不,您無法在不先讀取對象的情況下更新對象。當您用新數據「覆蓋」一個對象時,對象的新版本將包含只有明確寫入的數據。

您應該製作允許客戶端設置的屬性列表,並且僅在客戶端發送並且位於白名單中的屬性值後更新對象(在讀取對象後)。

E.g. (使用NDB語法):

whitelist = ['prop1', 'prop2', ...] 

def update_entity(key, **changed_values): 
    ent = key.get() 
    for name, value in changed_values.items(): 
    if name in whitelist: 
     setattr(ent, name, value) # Or ent._properties[name]._set_value(ent, value) 
    ent.put() 
+0

謝謝你的回答和建議! – thejaz