PYMODM使用记录

本文档介绍了PYMODM在处理MongoDB文档时的使用技巧,包括字段赋值、子文档操作、主键使用、索引管理和引用解析等关键点,帮助理解并有效运用PYMODM库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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数据类型

  • QuerySetonly方法默认会返回_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引用文档的具体字段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值