MongoEngine – 字段
一个MongoEngine文档类有一个或多个属性。每个属性都是一个字段类的对象。BaseField是基类或所有字段类型。BaseField类的构造函数有以下参数 –
db_field 代表数据库字段的名称。
required参数决定这个字段的值是否是必需的,默认为false。
默认 参数包含该字段的默认值。
unique 参数默认为false。如果你想让这个字段在每个文档中都有唯一的值,请设置为true。
primary_key 参数默认为false。为真则此字段为主键。
有许多从BaseField派生的字段类。
数值字段
IntField (32位整数), LongField (64位整数),FloatField(浮点数)字段构造函数有min_value和max_value参数。
还有一个 DecimalField 类。这个字段的对象的值是一个浮点数,其精度可以被指定。以下是为DecimalField类定义的参数-
min_value | 指定可接受的最小值 |
---|---|
max_value | 指定该字段可以有的最大值 |
force_string | 如果是True,这个字段的值将以字符串的形式存储。 |
precision | 限制浮动表示法的位数 |
rounding | 数字按照以下预定义的常数进行四舍五入 decimal.ROUND_CEILING (朝向无穷大) decimal.ROUND_DOWN (朝向零) decimal.ROUND_FLOOR (朝向-无穷大) decimal.ROUND_HALF_DOWN (到最近的,并联到零) decimal.十进制.ROUND_HALF_EVEN (向最近的偶数整数并列前进) 十进制.ROUND_HALF_UP (向最近的并列前进,远离零) 十进制.ROUND_UP (远离零) 十进制.ROUND_05UP (如果向零进位后最后一位数字是0或5,则远离零,否则向零前进) |
文本字段
StringField对象可以存储任何Unicode值。你可以在构造函数中指定字符串的min_length和max_length。 URLField 对象是一个StringField,具有验证输入为URL的能力。 EmailField 将字符串验证为有效的电子邮件表示。
domain_whitelist参数包含你不支持的无效域名列表。如果设置为True,allow_utf8_user参数允许字符串包含UTF8字符作为电子邮件的一部分。allow_ip_domain参数默认为假,但如果为真,它可以是一个有效的IPV4或IPV6地址。
下面的例子使用了数字和字符串字段 –
当上述代码被执行时,学生集合显示了一个文件,如下所示
ListField
这种类型的字段包装了任何标准字段,从而允许在数据库中把多个对象作为一个列表对象使用。这种字段可以与ReferenceField一起使用,实现一对多的关系。
上面例子中的学生文档类被修改如下
添加的文件以JSON格式显示,如下所示 −
DictField
DictField类的一个对象存储一个Python字典对象。在相应的数据库字段中,这也将被存储。
在上面的例子中,我们把ListField的类型改为DictField。
数据库中的文件显示如下 –
ReferenceField
一个MongoDB文档可以使用这种类型的字段存储对另一个文档的引用。这样,我们可以像在RDBMS中一样实现连接。ReferenceField构造函数使用其他文档类的名称作为参数。
在下面的例子中,StudentDB数据库包含两个文档类,学生和教师。学生类的文档包含对教师类对象的引用。
运行上述代码并在Compass GUI中验证结果。在StudentDB数据库中创建了与两个文档类对应的两个集合。
添加的教师文档如下
该学生文件显示的内容如下
请注意,学生文档中的ReferenceField存储了相应教师文档的_id。当访问时,学生对象会自动变成一个引用,并在访问相应的教师对象时被取消引用。
要向正在定义的文档添加引用,请使用 “self “而不是其他文档类作为ReferenceField的参数。可以注意的是,使用ReferenceField可能会导致检索文档的性能下降。
ReferenceField构造函数也有一个可选的参数,即 reverse_delete_rule。它的值决定了如果被引用的文档被删除,该怎么做。
可能的值如下
- DO_NOTHING (0) – 不做任何事情(默认)。
-
NULLIFY (1) – 将引用更新为空。
-
CASCADE (2) – 删除与该引用相关的文件。
-
DENY (3) – 防止删除引用对象。
-
PULL (4) – 从引用的ListField中提取引用。
你可以使用引用列表来实现一对多的关系。假设一个学生文档必须与一个或多个教师文档相关,学生类必须有一个ListField的引用实例。
在Compass中验证上述代码的结果时,你会发现学生文件中有两个教师文件的参考资料-
DateTimeField
DateTimeField类的一个实例允许在MongoDB数据库中使用日期格式的数据。MongoEngine寻找Python-DateUtil库来解析适当日期格式的数据。如果它在当前安装中不可用,则使用内置时间模块的time.strptime()函数表示日期。这种类型的字段的默认值是当前的日期时间实例。
DynamicField
不同的和变化的数据类型可以由这个字段处理。这种类型的字段由 DynamicDocument 类内部使用。
ImageField
这种类型的字段对应于文档中可以存储图像文件的字段。该类的构造函数可以接受大小和缩略图大小参数(都是像素大小)。