Expando 类

注意强烈建议构建新应用的开发者使用 NDB 客户端库,它与 DB 客户端库相比具有多项优势,例如可通过 Memcache API 进行自动实体缓存。如果您当前使用的是较早的 DB 客户端库,请参阅 DB 到 NDB 的迁移指南

Expando 类是用于数据模型定义(其属性动态确定)的超类。Expando 模型可以具有类似于 Model 的固定属性和在运行时分配给实体的动态属性的组合。

Expandogoogle.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 类中定义的固定属性对应,或与动态属性对应。