django-mongodb-backend是目前最稳妥的选择,由mongodb官方支持、兼容django 6.0+、原生支持admin/auth/contenttypes等核心模块,但需正确配置主键类型、连接参数及各contrib应用的default_auto_field。

直接用 django-mongodb-backend 是目前最稳妥的选择,它由 MongoDB 官方支持,兼容 Django 6.0+,且能原生使用 admin、auth、contenttypes 等核心模块——前提是正确配置主键类型和连接参数。其他方案(如 Djongo、MongoEngine)要么已停止维护,要么绕过 Django ORM 核心机制,后期容易踩坑。
用 django-mongodb-backend 配置 DATABASES
不推荐手动拼接 URI 或拆分 host/port/user/password 字段,容易漏掉 SRV 协议或认证数据库(authSource)等关键项。直接把完整连接串塞进 HOST 最省事,也最不容易出错。
-
ENGINE必须设为"django_mongodb_backend",不是"djongo"或"mongoengine" -
HOST值应为完整 URI,例如:"mongodb+srv://user:pass@cluster.mongodb.net/?authSource=admin";本地测试可简化为"mongodb://localhost:27017" -
NAME是你要用的数据库名,比如"myapp_db",它会在首次写入时自动创建 -
OPTIONS可选,但建议加{"tls": True}(Atlas 必需)、{"maxPoolSize": 100}(高并发场景)
必须重写 contrib 应用的 default_auto_field
默认 Django 模型用 AutoField(自增整数),但 MongoDB 不支持。不改这个,python manage.py migrate 会报 FieldError: AutoField requires a default value,admin 页面新建用户/权限也会失败。
- 在项目根目录下新建
apps.py,定义三个子类: -
MongoAdminConfig:继承AdminConfig,设default_auto_field = "django_mongodb_backend.fields.ObjectIdAutoField" -
MongoAuthConfig:同理继承AuthConfig -
MongoContentTypesConfig:同理继承ContentTypesConfig - 然后在
settings.py的INSTALLED_APPS中替换原应用,例如把"django.contrib.admin"换成"myproject.apps.MongoAdminConfig"
模型字段与查询的边界在哪
django-mongodb-backend 支持大部分标准 Django 字段(CharField、DateTimeField、BooleanField 等),但不支持 ForeignKey、ManyToManyField、GenericRelation 这类关系型语义字段——MongoDB 本身没外键约束,强行模拟只会让代码变脆。
- 嵌套文档用
EmbeddedField(需显式声明model_container),不是JSONField - 数组字段直接用
ArrayField(Django 4.2+ 原生支持),不要用ListField(那是 MongoEngine 的) - 聚合查询必须走
raw_aggregate()方法,不能用annotate()+Count()组合 - 地理空间字段(
PointField、PolygonField)可用,且自动建2dsphere索引
最容易被忽略的是 ObjectIdAutoField 的全局生效范围——它只对明确指定该 default_auto_field 的 app 生效,如果你有自定义 app 没在 apps.py 里声明,它的模型仍会沿用 AutoField,导致 save() 报错。别指望“默认继承”,每个含模型的 app 都得单独配。











