Expando 类是用于数据模型定义(其属性动态确定)的超类。Expando 模型可以具有固定属性(类似于 Model)和动态属性(运行时分配给实体)的组合。
Expando 由 google.appengine.ext.db 模块提供。
Expando 是 Model 的子类,且从该类继承它的类和实例方法。Expando 类不定义或覆盖任何方法。
Expando 模型可以有固定属性和动态属性。固定属性的行为类似 Model 的属性,并在 Expando Model 类中使用类属性以相似的方式定义。当在实例上为动态属性分配值时创建动态属性。同一 Expando 类的两个实例可拥有不同组的动态属性,甚至可以有名称相同但类型不同的动态属性。动态属性始终是可选的且没有默认值:直到为这些属性分配值,它们才存在。
动态属性无法使用 Property 实例来执行验证、设置默认值或对值应用自动逻辑。动态属性只是存储支持的数据存储区类型的值。请参阅类型和 Property 类。
动态属性与固定属性的不同之处还在于不能对类属性和数据存储区属性名称使用不同的名称。请参阅禁止使用的属性名称。
提示:如果您要使用 Property 类验证动态属性值,您可以实例化该 Property 类并对该值调用其 validate() 方法。
Expando 子类可以定义类似 Model 类的固定属性。Expando 的固定属性的行为与 Model 的属性类似。Expando 实例可以拥有固定属性和动态属性。
import datetime
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 myobj.myprop
Expando 类的构造函数定义如下:
一个 Model 类,其属性在使用前不需要在类中定义。与 Model 类似,Expando 类必须成为子类才能定义数据实体的类型。
Expando 是 Model 的子类,且可以继承或覆盖其方法。
参数:
新实体的名称。该名称会成为主键的一部分。如果为 None,将为键使用系统生成的 ID。
key_name 的值不得以数字开头 也绝不能采用 __*__ 的形式。如果您的应用程序使用用户提交的数据来作为数据存储区实体的键名(例如电子邮件地址),则应用程序应先清理该值(例如为其添加“key:”等已知的字符串前缀),使其符合这些要求。
key_name 存储为 Unicode 字符串,str 值转换为 ASCII 文本。