注意:强烈建议构建新应用的开发者使用 NDB 客户端库,它与 DB 客户端库相比具有多项优势,例如可通过 Memcache API 进行自动实体缓存。如果您当前使用的是较早的 DB 客户端库,请参阅 DB 到 NDB 的迁移指南
Expando 类是用于数据模型定义(其属性动态确定)的超类。Expando 模型可以具有类似于 Model 的固定属性和在运行时分配给实体的动态属性的组合。
Expando
由 google.appengine.ext.db
模块提供。
Expando 是 Model 的子类,并继承该类的类和实例方法。Expando 类不定义或重写任何方法。
简介
Expando 模型可以有固定属性和动态属性。固定属性的行为类似于 Model 的属性,并且使用类属性在 Expando 模型类中进行类似定义。当在实例上为动态属性分配值时,系统将创建动态属性。同一 Expando 类的两个实例可拥有不同的动态属性组合,甚至可以有名称相同但类型不同的动态属性。动态属性始终是可选的且没有默认值:直到为这些属性分配值时,它们才存在。
动态属性不能使用 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 类,其属性在使用前不需要在类中定义。与 Model 类似,必须对 Expando 类进行子类化才能定义数据实体的种类。
Expando 是 Model 的子类,并继承或重写其方法。
参数
- parent
- 新实体的父实体的 Model 实例或 Key 实例。
- key_name
-
新实体的名称。该名称会成为主键的一部分。如果此参数为
None
,则系统生成的 ID 将用于该键。key_name 的值不得以数字开头,也不得采用
__*__
格式。如果您的应用使用用户提交的数据(例如电子邮件地址)作为数据存储区实体键名称,则应用应首先清理该值,例如在其前面添加一个已知字符串(如“key:”),以满足这些要求。key_name
存储为 Unicode 字符串,str
值转换为 ASCII 文本。 - **kwds
- 实例属性的初始值,作为关键字参数。每个名称与新实例的属性对应,并可能与 Expando 类中定义的固定属性对应,或与动态属性对应。