PYMODM使用记录
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 ofgeneration for this :class:`ObjectId`.The :class:`datetime.datetime` is timezone aware, andrepresents the generation time in UTC. It is precise to thesecond."""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引用文檔的具體字段。
總結
以上是生活随笔為你收集整理的PYMODM使用记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EA+svn实现UML的版本号控制
- 下一篇: HP MSA2000-硬盘leftove