MongoEngine 的核心是 Document 类。每个继承 Document 的类对应一个集合。
from mongoengine import (
Document, StringField, IntField, ListField,
DateTimeField, EmbeddedDocument, EmbeddedDocumentField,
ReferenceField, EmailField
)
from datetime import datetime, timezone
class Address(EmbeddedDocument): # 嵌入式文档(不单独存集合)
city = StringField(required=True)
street = StringField()
class Student(Document):
name = StringField(required=True, max_length=20)
age = IntField(min_value=6, max_value=60, default=18)
email = EmailField(unique=True, sparse=True)
tags = ListField(StringField(), default=list)
address = EmbeddedDocumentField(Address)
#created_at = DateTimeField(default=datetime.utcnow)
created_at = DateTimeField(default=lambda: datetime.now(timezone.utc), required=True)
meta = {
"collection": "students",
"indexes": ["email", "-created_at"],
}
def to_dict(self):
"""序列化为 JSON 友好的字典(Flask 里 ObjectId 不能直接 jsonify)"""
return {
"id": str(self.id),
"name": self.name,
"age": self.age,
"email": self.email,
"tags": self.tags,
"address": self.address,
"created_at": self.created_at.isoformat(),
}
class Course(Document):
title = StringField(required=True)
students = ListField(ReferenceField(Student)) # 引用关系