附註:我們強烈建議建構新應用程式的開發人員使用 NDB 用戶端程式庫,因為 NDB 用戶端程式庫與本用戶端程式庫相較之下有幾個優點,例如能透過 Memcache API 自動將實體加入快取。如果您目前使用的是舊版的 DB 用戶端程式庫,請參閱從 DB 至 NDB 的遷移指南。
有些資料模型定義的屬性是以動態方式決定的,而 Expando 類別是這類定義的父類別。Expando 模型可同時具有類似 Model 的固定屬性以及在執行階段指派給實體的動態屬性。
Expando
由 google.appengine.ext.db
模組提供。
Expando 是 Model 的子類別,會沿用 Model 類別的類別和執行個體方法。Expando 類別不會定義或覆寫任何方法。
簡介
Expando 模型可具有固定屬性和動態屬性。固定屬性的行為與 Model 屬性類似,且在 Expando 模型類別中是使用類別屬性以類似方式定義。動態屬性則是在執行個體中獲指派值時建立。相同 Expando 類別的兩個執行個體可有不同的動態屬性組合,甚至可具有名稱相同但類型不同的動態屬性。動態屬性一律是選用屬性,且沒有預設值:這些屬性在獲指派值之前並不存在。
動態屬性不可使用 Property 執行個體執行驗證作業、設定預設值,或為值套用自動邏輯,而只會儲存受支援資料儲存庫類型的值。請參閱「類型和 Property 類別」。
此外,不同於固定屬性,動態屬性無法針對類別屬性和資料儲存庫屬性使用不同名稱。詳情請參閱不允許的屬性名稱一文。
提示:如果您想使用 Property 類別驗證動態屬性值,可以將 Property 類別執行個體化,並針對值呼叫 Property 類別的 validate() 方法。
Expando 子類別可定義類似 Model 類別的固定屬性。Expando 固定屬性的行為與 Model 的屬性類似。Expando 執行個體可同時具有固定和動態屬性。
import datetime from google.appengine.ext import db class Song(db.Expando): title = db.StringProperty() crazy = Song(title='Crazy like a diamond', author='Lucy Sky', publish_date='yesterday', rating=5.0) hoboken = Song(title='The man from Hoboken', author=['Anthony', 'Lou'], publish_date=datetime.datetime(1977, 5, 3)) crazy.last_minute_note=db.Text('Get a train to the station.')
Expando 執行個體的動態 (非固定) 屬性是可以刪除的。為刪除動態屬性,應用程式會刪除執行個體的屬性:
del crazy.last_minute_note
建構函式
Expando 類別的建構函式定義如下:
- class Expando(parent=None, key_name=None, **kwds)
-
不需要在使用前先於類別中定義屬性的模型類別。如同 Model,Expando 類別必須變成子類別才能定義資料實體的種類。
Expando 是 Model 的子類別,會沿用或覆寫 Model 類別的方法。
引數
- parent
- 實體 (為新實體的父項) 的 Model 例項或 Key 例項。
- key_name
-
新實體的名稱。這個名稱會成為主要金鑰的一部分。如果值為
None
,系統會使用系統產生的 ID 做為金鑰。key_name 值的開頭不得為數字,且格式不得為
__*__
。如果您的應用程式是以使用者提交的資料做為資料儲存庫實體金鑰名稱 (例如電子郵件地址),應用程式應先對值進行處理以滿足這些要求,例如在前方加上「key:」等已知字串。key_name
會以 Unicode 字串形式儲存,其中str
值會轉換成 ASCII 文字。 - **kwds
- 例項屬性的初始值,形式為關鍵字引數。每個名稱會對應到新執行個體的一項屬性,且可能與 Expando 類別中定義的固定屬性對應,或本身即為動態屬性。