Djongo框架下Django admin提示Company ID为None不存在的修复方法
问题根因
Django默认会为未显式声明主键的模型自动创建一个整数类型的id字段作为主键,但MongoDB中文档的默认主键是名为_id的ObjectId类型字段,二者映射不匹配导致Django无法正确读取到主键值,所以后台显示ID为None,编辑时找不到对应对象。
修复步骤
1. 修正models.py定义
你需要显式声明主键字段,映射MongoDB的_id字段,如果你使用的是djongo作为Django-MongoDB连接后端,修改代码如下:
# 注意导入的是djongo的models而非django原生的models from djongo import models class Company(models.Model): # 显式声明主键,映射MongoDB的_id字段 id = models.ObjectIdField(primary_key=True, db_column='_id') name = models.CharField(max_length=100, blank=False, null=False, unique=True)
如果你使用的是其他MongoDB连接后端(如django-mongodb-engine),仅需调整对应ObjectId字段的导入即可,映射逻辑不变。
2. 可选:优化admin后台显示
修改admin.py,在列表页直接展示ID和名称,提升可读性:
from django.contrib import admin from .models import Company @admin.register(Company) class CompanyAdmin(admin.ModelAdmin): list_display = ('id', 'name')
3. 生效配置
删除应用下旧的迁移文件(migrations目录下除__init__.py之外的文件),重新执行迁移命令即可:
python manage.py makemigrations python manage.py migrate
修改完成后Django就能正确识别MongoDB中的主键,后台不会再显示object(None),编辑也不会报错。
内容的提问来源于stack exchange,提问作者user7429643
相关产品推荐
相关产品推荐

