如何在Mongoengine类模型中以datetime作为属性名定义数据结构
实现方案
Mongoengine 内置的 MapField 专门适配键名动态、值结构统一的文档对象场景,完全匹配你提到的 bp_data 存储需求,代码实现如下:
1. 导入依赖
from mongoengine import Document, EmbeddedDocument from mongoengine.fields import ( StringField, IntField, DateTimeField, MapField, EmbeddedDocumentField, DictField )
2. 定义内嵌结构(对应 bp_data 下每个时间键的值结构)
先定义每个动态时间键对应的固定字段结构,如果你的业务中每个时间节点下的字段不固定,可以跳过这一步直接用 DictField 作为 MapField 的值类型。
class BpRecordItem(EmbeddedDocument): # 可根据实际业务字段调整,以下为血压数据常见字段示例 systolic = IntField(required=True) # 收缩压 diastolic = IntField(required=True) # 舒张压 heart_rate = IntField() # 心率 note = StringField() # 备注
3. 定义主集合类
class HealthRecord(Document): # 外层其他业务字段示例,可自行调整 user_id = StringField(required=True) create_time = DateTimeField(auto_now_add=True) # 核心动态字段bp_data:键为字符串格式的时间,值为上面定义的BpRecordItem结构 bp_data = MapField(field=EmbeddedDocumentField(BpRecordItem)) # 如果不需要校验每个时间键下的字段结构,也可以直接写为: # bp_data = MapField(field=DictField())
调用示例
# 新增数据示例 item1 = BpRecordItem(systolic=122, diastolic=78, heart_rate=70) item2 = BpRecordItem(systolic=130, diastolic=82, heart_rate=75) record = HealthRecord( user_id="u_001", bp_data={ "2024-06-10 09:00:00": item1, "2024-06-10 18:30:00": item2 } ) record.save()
内容的提问来源于stack exchange,提问作者Saisiva A
相关产品推荐
相关产品推荐

