Django中词典和模型上的模式
django-data-schema的Python项目详细描述
django数据模式
django数据模式是一个轻量级django应用程序,用于定义模型、字典或列表的模式。 通过在一段数据上描述一个模式,这允许其他应用程序轻松地引用 模型字段或字典中的字段(或其相关的json字段)。
django数据模式还负责引擎盖下的所有转换,例如解析datetime字符串、将字符串转换为数值、在值不存在时使用默认值等等。
- 安装
- 型号概述
- 示例 < > >
字段键
:字段的名称。用于标识字典或模型中的字段。字段位置
:字段的位置。用于标识列表中的字段。唯一性顺序:此字段在架构的唯一性约束中的顺序。默认为无。
字段类型:字段的类型。有关以下字段类型的详细信息。
字段格式
:字段的可选格式字符串。根据字段类型的不同而使用不同的方法,并在下面详细说明。默认值
:如果字段返回none,则将返回此默认值。fieldschematype.date
:来自datetime
模块的pythondate
对象。当前返回为datetime
对象。fieldschematype.datetime
:来自datetime
模块的pythondatetime
对象。fieldschematype.int
:一个pythonint
fieldschematype.float
:一个pythonfloat
fieldschematype.string
:一个pythonstr
fieldschematype.boolean
:一个pythonbool
- 如果对python
int
或float
值调用,数值将传递给datetime.utcfromtimestamp
函数。
如果调用在 - 如果对Aware DateTime对象(或带时区的字符串)调用,它将转换为原始UTC时间。
- 如果调用none,则返回默认值(或none)。
- 如果对
字符串
或unicode
值调用,则该字符串将被除去除句点以外的所有非数字数字。如果字符串为空,将返回默认值(或无)。否则,字符串将被传递到int()
或float()
- 如果对
int
或float
调用,该值将传递给int()
或float()
函数。 - 不能转换其他值。
字段格式
参数被忽略。 - 如果调用none,则返回默认值(或none)。
- 如果对
字符串
或unicode
值调用,则字符串将被除去所有尾随和前导空格。如果指定了field_format
,则字符串将与regex匹配。如果通过,则返回字符串。如果没有,则返回None并使用默认值(或None)。 - 所有其他类型都传递到
str()
函数。 - 如果调用none,则返回默认值(或none)。
- bool数据类型将返回true或false
- truthy-looking字符串值返回true('t','t','true','true','true',1',1')
- 看似错误的字符串值返回false('f','f','false','false','false',0',0')
- 如果调用none,则返回默认值(或none)。
安装
pipinstalldjango-data-schema
型号概述
django数据模式定义了三个用于在数据上构建模式的模型。这些模型是dataschema
,
fieldschema
,和fieldoptional
dataschema
模型提供指向djangocontent type
模型的模型内容类型
字段。
此字段表示此架构正在建模的对象。如果字段为"无",则假定
此架构对对象(如字典或列表)建模。
在定义了封闭的dataschema之后,各种fieldschema
模型可以引用main
数据架构。fieldschema
模型提供以下属性:
对象必须指定其数据类型。虽然给定类型的数据可以以不同的格式存储,
django数据模式在通过get_value
访问数据时规范化数据,如下所述。可用的
类型列在fieldschematype
类中。这里列出了这些类型,它们的标准化类型为:
当通过fieldschema.get_value访问数据时,这些字段提供了必要的转换机制。下面将详细介绍获取值
函数操作方式的差异。
使用"在日期或日期时间获取值"字段
函数对日期和日期时间字段具有以下行为:
字符串
或unicode
值上,字符串将去掉所有尾随和前导空格。如果字符串为空,将使用默认值(或无)。如果字符串不是空的,它将被传递给DateUtil的parse
函数。如果在fieldschema
对象上指定了字段格式
字段,则它将被传递到strptime
函数。在int或float字段上使用get_value
函数在int和float字段上有以下行为:
对字符串字段使用get_value
函数在字符串字段上有以下行为:
对布尔字段使用get_value
函数在布尔字段上有以下行为:
示例
可以按如下方式创建数据架构:
fromdata_schemaimportDataSchema,FieldSchema,FieldSchemaTypeuser_login_schema=DataSchema.objects.create()user_id_field=FieldSchema.objects.create(data_schema=user_login_schema,field_key='user_id',uniqueness_order=1,field_type=FieldSchemaType.STRING)login_time_field=FieldSchema.objects.create(data_schema=user_login_schema,field_key='login_time',field_type=FieldSchemaType.DATETIME)
上面的示例表示用户登录的架构。在这个模式中,用户id字段提供了 数据的约束。然后,只需执行以下操作即可轻松访问唯一性约束。
unique_fields=user_login_schema.get_unique_fields()
上面的函数按指定的顺序返回唯一字段,允许用户 为数据生成唯一的ID。
要使用模式获取数据值,可以使用get_value
函数,如下所示:
data={'user_id':'my_user_id','login_time':1396396800,}printlogin_time_field.get_value(data)2014-04-0200:00:00
注意,get_value
函数查看数据对象的类型并使用正确的访问方法。如果
数据对象是一个dict
,它使用数据[字段键]
访问它。如果它是一个对象,它用
getattr(数据,字段键)
。数组被访问为数据[字段位置]
下面是用格式字符串解析数组中datetime对象的另一个示例。
string_time_field_schema=FieldSchema.objects.create(data_schema=data_schema,field_key='time',field_position=1,field_type=FieldSchemaType.DATETIME,field_format='%Y-%m-%d %H:%M:%S')printstring_time_field_schema.get_value(['value','2013-04-12 12:12:12'])2013-04-1212:12:12
注意,如果您正在解析数字字段,django数据模式将去掉任何非数字值,允许用户获取基于货币的数字和其他格式的值。
revenue_field_schema=FieldSchema.objects.create(data_schema=data_schema,field_key='revenue',field_type=FieldSchemaType.FLOAT)printrevenue_field_schema.get_value({'revenue':'$15,000,456.23'})15000456.23
注意,fieldschema对象有一个类似的设置字段值的方法。 set-value方法不进行任何数据转换,因此在调用此方法时,请确保使用值 这是正确的信息矩阵。