Django中词典和模型上的模式

django-data-schema的Python项目详细描述


构建状态

django数据模式

django数据模式是一个轻量级django应用程序,用于定义模型、字典或列表的模式。 通过在一段数据上描述一个模式,这允许其他应用程序轻松地引用 模型字段或字典中的字段(或其相关的json字段)。

django数据模式还负责引擎盖下的所有转换,例如解析datetime字符串、将字符串转换为数值、在值不存在时使用默认值等等。

  1. 安装
  2. 型号概述
  3. 示例
  4. < > >

    安装

    pipinstalldjango-data-schema

    型号概述

    django数据模式定义了三个用于在数据上构建模式的模型。这些模型是dataschemafieldschema,和fieldoptional

    dataschema模型提供指向djangocontent type模型的模型内容类型字段。 此字段表示此架构正在建模的对象。如果字段为"无",则假定 此架构对对象(如字典或列表)建模。

    在定义了封闭的dataschema之后,各种fieldschema模型可以引用main 数据架构。fieldschema模型提供以下属性:

    • 字段键:字段的名称。用于标识字典或模型中的字段。
    • 字段位置:字段的位置。用于标识列表中的字段。
    • 唯一性顺序:此字段在架构的唯一性约束中的顺序。默认为无。
    • 字段类型:字段的类型。有关以下字段类型的详细信息。
    • 字段格式:字段的可选格式字符串。根据字段类型的不同而使用不同的方法,并在下面详细说明。
    • 默认值:如果字段返回none,则将返回此默认值。

    对象必须指定其数据类型。虽然给定类型的数据可以以不同的格式存储, django数据模式在通过get_value访问数据时规范化数据,如下所述。可用的 类型列在fieldschematype类中。这里列出了这些类型,它们的标准化类型为:

    • fieldschematype.date:来自datetime模块的pythondate对象。当前返回为datetime对象。
    • fieldschematype.datetime:来自datetime模块的pythondatetime对象。
    • fieldschematype.int:一个pythonint
    • fieldschematype.float:一个pythonfloat
    • fieldschematype.string:一个pythonstr
    • fieldschematype.boolean:一个pythonbool

    当通过fieldschema.get_value访问数据时,这些字段提供了必要的转换机制。下面将详细介绍获取值函数操作方式的差异。

    使用"在日期或日期时间获取值"字段

    函数对日期和日期时间字段具有以下行为:

    • 如果对pythonintfloat值调用,数值将传递给datetime.utcfromtimestamp函数。
    • 如果调用在字符串unicode值上,字符串将去掉所有尾随和前导空格。如果字符串为空,将使用默认值(或无)。如果字符串不是空的,它将被传递给DateUtil的parse函数。如果在fieldschema对象上指定了字段格式字段,则它将被传递到strptime函数。
    • 如果对Aware DateTime对象(或带时区的字符串)调用,它将转换为原始UTC时间。
    • 如果调用none,则返回默认值(或none)。

    在int或float字段上使用get_value

    函数在int和float字段上有以下行为:

    • 如果对字符串unicode值调用,则该字符串将被除去除句点以外的所有非数字数字。如果字符串为空,将返回默认值(或无)。否则,字符串将被传递到int()float()
    • 如果对intfloat调用,该值将传递给int()float()函数。
    • 不能转换其他值。字段格式参数被忽略。
    • 如果调用none,则返回默认值(或none)。

    对字符串字段使用get_value

    函数在字符串字段上有以下行为:

    • 如果对字符串unicode值调用,则字符串将被除去所有尾随和前导空格。如果指定了field_format,则字符串将与regex匹配。如果通过,则返回字符串。如果没有,则返回None并使用默认值(或None)。
    • 所有其他类型都传递到str()函数。
    • 如果调用none,则返回默认值(或none)。

    对布尔字段使用get_value

    函数在布尔字段上有以下行为:

    • bool数据类型将返回true或false
    • truthy-looking字符串值返回true('t','t','true','true','true',1',1')
    • 看似错误的字符串值返回false('f','f','false','false','false',0',0')
    • 如果调用none,则返回默认值(或none)。

    示例

    可以按如下方式创建数据架构:

    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方法不进行任何数据转换,因此在调用此方法时,请确保使用值 这是正确的信息矩阵。

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


热门话题
java为什么只为字符数组重载println方法,而不为字符串、整数等其他数组重载?   java将快速线程返回到池中,而不是等待慢速线程   创建jar文件时java SwingWorker不工作   java如何将依赖注入RabbitListener   java如何在gradle任务中通过scp复制目录?   java在MySql数据库中创建表时,遇到NullPointerException   java HTTP Status 500 Servlet执行引发异常   在JAVA中对arraylist使用继承时出错   java PowerMockito未完成存根异常   如果没有错误/警告增加到某个极限,java是否停止在eclipse中构建项目或使用maven?   java Robolectric如何测试DateFormat。getBestDateTimePattern()   google云平台GCP数据存储Java API,构建一个空值实体   VerifyListener和FocusListener之间的java冲突   安卓是否可以在Java中的另一个方法内部强制调用一个方法?   JavaWindows7、JDK1.8、SpringBoot应用程序JAR在方法安全性方面占用了大量时间。getProviders()返回   Bean提供程序的java错误消息   java Slick动画每帧必须有一个持续时间   java无法在Trie中设置isLeaf标志   java为什么JVM不能创建包含main方法的类的对象,以便从该类访问main方法,如果它具有该类的名称?   java Apache Camel+CXF端点身份验证