PYMODM使用TIPS
-
ListField
存储其他文档的引用列表时,可以这样定义:class MongoPaper(MongoModel): """mongo试卷""" paper_id = fields.IntegerField(verbose_name='sql试卷pk', primary_key=True) outlines = fields.ListField(field=fields.ReferenceField(Outline), verbose_name='提纲', blank=True)
可以直接为
outlines
字段赋值:m_paper = MongoPaper( paper_id=123, outlines=['5cbdaf60f4880d0cd8a77ee0', '5cbdb25ef4880d4de4f32fe1', '5cbd8d03f4880d5d543c3263']) # 保存时,会自动将列表中的_id字符串转化为ObjectId对象 if m_paper.is_valid(): m_paper.save()
-
如果要插入子文档,利用
to_son()
方法,将model转化为son对象,或者直接用字典字段。 -
MongoModel
实例的pk
属性,返回ObjectId
对象 -
MongoModel
中的ReferenceField
字段,在mongo数据库中存储为ObjectId
数据类型 -
QuerySet
的only
方法默认会返回_id
,_cls
字段 -
如果在定义模型时,通过
primary_key
指定某个字段为主键,保存时可以使用该字段。但查询时,仍然通过_id
字段 -
如果自定义A集合的主键为
int
,B集合中的文档通过ReferenceField
引用了A集合中的文档,那么在MongoDB存储中,引用字段类型是int
而不是ObjectId
,但是Pymodm依然可以自动解析引用:{ "_id" : ObjectId("5cd23e44f4880d8c48cd29a5"), "status" : 0, "score" : 19, "cost_time" : 3600, "submit_time" : 1557282372, "answer_sheet" : [ { "user_answer" : "C", "is_correct" : 2, "points" : 0, "exercise" : ObjectId("5cb99660f4880d50385dfeff"), "outline_index" : 1, "exercise_index" : 1, "type" : 0, "model" : 0, "is_child" : false, "parent" : null, "score" : 2 }, ], "user_id" : 1062, "paper" : 11, // 引用paper "_cls" : "api_service.models.UserPaper" }
print(user_paper.paper.name) # 第一次模拟测试
-
EmbeddedMongoModel
子文档的Meta
属性,也可以设定final=True
,来禁止生成_cls
字段 -
如果已经针对某个集合建立了索引,修改该索引时提示索引已存在,需要先删除旧的索引。
-
mongoDB的默认主键是
ObjectId
对象,是一个24位的16进制字符串,其中前4位表示时间,在python中可以通过调用该对象的generation_time
属性来获取,源码如下:@property def generation_time(self): """A :class:`datetime.datetime` instance representing the time of generation for this :class:`ObjectId`. The :class:`datetime.datetime` is timezone aware, and represents the generation time in UTC. It is precise to the second. """ timestamp = struct.unpack(">i", self.__id[0:4])[0] return datetime.datetime.fromtimestamp(timestamp, utc)
-
pymodm会自动请求
ReferenceField
字段引用的对象(除非在no_auto_dereference
上下文中):print(isinstance(exercise.parent, MongoModel)) # True
但是如果调用
to_son().to_dict()
方法后,这种引用不复存在。 -
获取MongoModel表的所有字段:
MongoModel._mongometa.get_fields() # 由field对象组成的列表 # field对象的attname属性可以获取具体的字段名 [field_obj.attname for field_obj in type(model_obj)._mongometa.get_fields()]
-
pymodm如果解析到引用列表,会自动请求列表中的每个引用对象(包括打印时)。
-
设置某字段的
blank=True
属性后,保存文档时,如果该字段未赋值,那么文档在MongoDB数据库中的存储不含该字段。但是在获取文档对象该字段的值时,并不会报AttributeError
,而是返回None
-
project
指定文档的返回字段时,不能指定ReferenceField
引用文档的具体字段。