MongoEngine – 字段
一个MongoEngine文档类有一个或多个属性。每个属性都是一个字段类的对象。BaseField是基类或所有字段类型。BaseField类的构造函数有以下参数 –
BaseField(db_field, required, default, unique, primary_key)
db_field 代表数据库字段的名称。
required参数决定这个字段的值是否是必需的,默认为false。
默认 参数包含该字段的默认值。
unique 参数默认为false。如果你想让这个字段在每个文档中都有唯一的值,请设置为true。
primary_key 参数默认为false。为真则此字段为主键。
有许多从BaseField派生的字段类。
数值字段
IntField (32位整数), LongField (64位整数),FloatField(浮点数)字段构造函数有min_value和max_value参数。
还有一个 DecimalField 类。这个字段的对象的值是一个浮点数,其精度可以被指定。以下是为DecimalField类定义的参数-
DecimalField(min_value, max_value, force_string, precision, rounding)
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 将字符串验证为有效的电子邮件表示。
StringField(max-length, min_length)
URLField(url_regex)
EmailField(domain_whiltelist, allow_utf8_user, allow_ip_domain)
domain_whitelist参数包含你不支持的无效域名列表。如果设置为True,allow_utf8_user参数允许字符串包含UTF8字符作为电子邮件的一部分。allow_ip_domain参数默认为假,但如果为真,它可以是一个有效的IPV4或IPV6地址。
下面的例子使用了数字和字符串字段 –
from mongoengine import *
connect('studentDB')
class Student(Document):
studentid = StringField(required=True)
name = StringField()
age=IntField(min_value=6, max-value=20)
percent=DecimalField(precision=2)
email=EmailField()
s1=Student()
s1.studentid='001'
s1.name='Mohan Lal'
s1.age=20
s1.percent=75
s1.email='mohanlal@gmail.com'
s1.save()
当上述代码被执行时,学生集合显示了一个文件,如下所示
ListField
这种类型的字段包装了任何标准字段,从而允许在数据库中把多个对象作为一个列表对象使用。这种字段可以与ReferenceField一起使用,实现一对多的关系。
上面例子中的学生文档类被修改如下
from mongoengine import *
connect('studentDB')
class Student(Document):
studentid = StringField(required=True)
name = StringField(max_length=50)
subjects = ListField(StringField())
s1=Student()
s1.studentid='A001'
s1.name='Mohan Lal'
s1.subjects=['phy', 'che', 'maths']
s1.save()
添加的文件以JSON格式显示,如下所示 −
{
"_id":{"$oid":"5ea6a1f4d8d48409f9640319"},
"studentid":"A001",
"name":"Mohan Lal",
"subjects":["phy","che","maths"]
}
DictField
DictField类的一个对象存储一个Python字典对象。在相应的数据库字段中,这也将被存储。
在上面的例子中,我们把ListField的类型改为DictField。
from mongoengine import *
connect('studentDB')
class Student(Document):
studentid = StringField(required=True)
name = StringField(max_length=50)
subjects = DictField()
s1=Student()
s1.studentid='A001'
s1.name='Mohan Lal'
s1.subjects['phy']=60
s1.subjects['che']=70
s1.subjects['maths']=80
s1.save()
数据库中的文件显示如下 –
{
"_id":{"oid":"5ea6cfbe1788374c81ccaacb"},
"studentid":"A001",
"name":"Mohan Lal",
"subjects":{"phy":{"numberInt":"60"},
"che":{"numberInt":"70"},
"maths":{"numberInt":"80"}
}
}
ReferenceField
一个MongoDB文档可以使用这种类型的字段存储对另一个文档的引用。这样,我们可以像在RDBMS中一样实现连接。ReferenceField构造函数使用其他文档类的名称作为参数。
class doc1(Document):
field1=StringField()
class doc2(Document):
field1=StringField()
field2=ReferenceField(doc1)
在下面的例子中,StudentDB数据库包含两个文档类,学生和教师。学生类的文档包含对教师类对象的引用。
from mongoengine import *
connect('studentDB')
class Teacher (Document):
tid=StringField(required=True)
name=StringField()
class Student(Document):
sid = StringField(required=True)
name = StringField()
tid=ReferenceField(Teacher)
t1=Teacher()
t1.tid='T1'
t1.name='Murthy'
t1.save()
s1=Student()
s1.sid='S1'
s1.name='Mohan'
s1.tid=t1
s1.save()
运行上述代码并在Compass GUI中验证结果。在StudentDB数据库中创建了与两个文档类对应的两个集合。
添加的教师文档如下
{
"_id":{"$oid":"5ead627463976ea5159f3081"},
"tid":"T1",
"name":"Murthy"
}
该学生文件显示的内容如下
{
"_id":{"oid":"5ead627463976ea5159f3082"},
"sid":"S1",
"name":"Mohan",
"tid":{"oid":"5ead627463976ea5159f3081"}
}
请注意,学生文档中的ReferenceField存储了相应教师文档的_id。当访问时,学生对象会自动变成一个引用,并在访问相应的教师对象时被取消引用。
要向正在定义的文档添加引用,请使用 “self “而不是其他文档类作为ReferenceField的参数。可以注意的是,使用ReferenceField可能会导致检索文档的性能下降。
ReferenceField构造函数也有一个可选的参数,即 reverse_delete_rule。它的值决定了如果被引用的文档被删除,该怎么做。
可能的值如下
- DO_NOTHING (0) – 不做任何事情(默认)。
-
NULLIFY (1) – 将引用更新为空。
-
CASCADE (2) – 删除与该引用相关的文件。
-
DENY (3) – 防止删除引用对象。
-
PULL (4) – 从引用的ListField中提取引用。
你可以使用引用列表来实现一对多的关系。假设一个学生文档必须与一个或多个教师文档相关,学生类必须有一个ListField的引用实例。
from mongoengine import *
connect('studentDB')
class Teacher (Document):
tid=StringField(required=True)
name=StringField()
class Student(Document):
sid = StringField(required=True)
name = StringField()
tid=ListField(ReferenceField(Teacher))
t1=Teacher()
t1.tid='T1'
t1.name='Murthy'
t1.save()
t2=Teacher()
t2.tid='T2'
t2.name='Saxena'
t2.save()
s1=Student()
s1.sid='S1'
s1.name='Mohan'
s1.tid=[t1,t2]
s1.save()
在Compass中验证上述代码的结果时,你会发现学生文件中有两个教师文件的参考资料-
Teacher Collection
{
"_id":{"oid":"5eaebcb61ae527e0db6d15e4"},
"tid":"T1","name":"Murthy"
}
{
"_id":{"oid":"5eaebcb61ae527e0db6d15e5"},
"tid":"T2","name":"Saxena"
}
Student collection
{
"_id":{"oid":"5eaebcb61ae527e0db6d15e6"},
"sid":"S1","name":"Mohan",
"tid":[{"oid":"5eaebcb61ae527e0db6d15e4"},{"$oid":"5eaebcb61ae527e0db6d15e5"}]
}
DateTimeField
DateTimeField类的一个实例允许在MongoDB数据库中使用日期格式的数据。MongoEngine寻找Python-DateUtil库来解析适当日期格式的数据。如果它在当前安装中不可用,则使用内置时间模块的time.strptime()函数表示日期。这种类型的字段的默认值是当前的日期时间实例。
DynamicField
不同的和变化的数据类型可以由这个字段处理。这种类型的字段由 DynamicDocument 类内部使用。
ImageField
这种类型的字段对应于文档中可以存储图像文件的字段。该类的构造函数可以接受大小和缩略图大小参数(都是像素大小)。