Django Admin对接MongoDB时登录出现主键错误如何解决
报错原因
- Django默认所有模型必须存在主键字段,默认会自动生成名为
id的自增主键。MongoDB的默认主键为_id,当Djongo适配层没有正确完成两个字段的映射关系时,Django在登录Admin后台需要更新用户登录态调用save()方法时,会判定当前用户对象没有主键,触发对应报错。 - 版本兼容性冲突:Django 3.2及以上版本将全局默认主键类型修改为
BigAutoField,和Djongo的适配逻辑不兼容,无法自动映射为MongoDB的ObjectId类型主键。 - 模型定义缺失主键声明:如果项目自定义了用户模型,没有显式声明主键字段,也会触发该错误。
解决方案
- 优先使用兼容性经过验证的版本组合,推荐搭配:Django 3.2 + Djongo 1.3.6,避免版本适配问题。
- 在settings.py中添加全局主键配置,统一指定Djongo封装的ObjectId作为默认主键类型:
DEFAULT_AUTO_FIELD = 'djongo.models.ObjectIdField'
- 若项目自定义了用户模型,需要在模型中显式声明主键字段:
from djongo import models class User(models.Model): _id = models.ObjectIdField(primary_key=True) # 其余用户字段正常定义即可
- 完成配置修改后,删除MongoDB中已创建的用户集合,重新执行
django-admin createsuperuser命令生成新的超级用户,确保主键映射规则生效。
修改完成后重新启动Django服务即可正常登录Admin后台。
内容的提问来源于stack exchange,提问作者David González Blazman
相关产品推荐
相关产品推荐

