PYMODM使用记录
PYMODM使用TIPS
-  ListField存儲(chǔ)其他文檔的引用列表時(shí),可以這樣定義: 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'])# 保存時(shí),會(huì)自動(dòng)將列表中的_id字符串轉(zhuǎn)化為ObjectId對(duì)象 if m_paper.is_valid():m_paper.save()
-  如果要插入子文檔,利用to_son()方法,將model轉(zhuǎn)化為son對(duì)象,或者直接用字典字段。 
-  MongoModel實(shí)例的pk屬性,返回ObjectId對(duì)象 
-  MongoModel中的ReferenceField字段,在mongo數(shù)據(jù)庫中存儲(chǔ)為ObjectId數(shù)據(jù)類型 
-  QuerySet的only方法默認(rèn)會(huì)返回_id, _cls字段 
-  如果在定義模型時(shí),通過primary_key指定某個(gè)字段為主鍵,保存時(shí)可以使用該字段。但查詢時(shí),仍然通過_id字段 
-  如果自定義A集合的主鍵為int,B集合中的文檔通過ReferenceField引用了A集合中的文檔,那么在MongoDB存儲(chǔ)中,引用字段類型是int而不是ObjectId,但是Pymodm依然可以自動(dòng)解析引用: {"_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) # 第一次模擬測(cè)試
-  EmbeddedMongoModel子文檔的Meta屬性,也可以設(shè)定final=True,來禁止生成_cls字段 
-  如果已經(jīng)針對(duì)某個(gè)集合建立了索引,修改該索引時(shí)提示索引已存在,需要先刪除舊的索引。 
-  mongoDB的默認(rèn)主鍵是ObjectId對(duì)象,是一個(gè)24位的16進(jìn)制字符串,其中前4位表示時(shí)間,在python中可以通過調(diào)用該對(duì)象的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會(huì)自動(dòng)請(qǐng)求ReferenceField字段引用的對(duì)象(除非在no_auto_dereference上下文中): print(isinstance(exercise.parent, MongoModel)) # True但是如果調(diào)用to_son().to_dict()方法后,這種引用不復(fù)存在。 
-  獲取MongoModel表的所有字段: MongoModel._mongometa.get_fields() # 由field對(duì)象組成的列表 # field對(duì)象的attname屬性可以獲取具體的字段名 [field_obj.attname for field_obj in type(model_obj)._mongometa.get_fields()]
-  pymodm如果解析到引用列表,會(huì)自動(dòng)請(qǐng)求列表中的每個(gè)引用對(duì)象(包括打印時(shí))。 
-  設(shè)置某字段的blank=True屬性后,保存文檔時(shí),如果該字段未賦值,那么文檔在MongoDB數(shù)據(jù)庫中的存儲(chǔ)不含該字段。但是在獲取文檔對(duì)象該字段的值時(shí),并不會(huì)報(bào)AttributeError,而是返回None 
-  project指定文檔的返回字段時(shí),不能指定ReferenceField引用文檔的具體字段。 
總結(jié)
以上是生活随笔為你收集整理的PYMODM使用记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: EA+svn实现UML的版本号控制
- 下一篇: 搭建nfs,实现linux之间共享存储
