使用Djongo连接MongoDB的Django项目后台无法删除对象
问题修复方案及原因说明
根本原因
MongoDB 默认使用_id字段作为主键,类型为ObjectId;而Django默认会为未显式声明主键的模型自动创建一个int类型的自增主键id,二者类型不匹配。Djongo 无法将MongoDB生成的ObjectId映射到Django要求的int类型id字段,导致读取数据时拿到的id值为None,触发后续的查询、删除报错。
具体修复步骤
- 修改模型代码,显式声明适配MongoDB的主键字段,可同时添加
__str__方法优化后台显示效果:
# 注意导入djongo封装的models,而非Django原生的django.db.models from djongo import models class Property(models.Model): # 显式声明ObjectId类型的_id字段为主键 _id = models.ObjectIdField(primary_key=True) name = models.CharField(max_length=128, blank=False) property_type = models.CharField(max_length=24, blank=True) include_on = models.CharField(max_length=256, blank=True) format_example = models.TextField(blank=True) notes = models.TextField(blank=True) # 可选:自定义后台展示的文本,不会再显示"Property object(xxx)" def __str__(self): return self.name
- 执行迁移命令更新数据库映射:
python manage.py makemigrations python manage.py migrate
修改完成后无需清空已有数据,Djongo会自动匹配MongoDB中已存在的_id字段,原有数据可正常读取、编辑、删除。
操作错误说明
- 未为对接MongoDB的模型显式声明适配的主键字段,直接使用了Django默认的int类型自增主键,与MongoDB的主键类型不兼容。
- 导入了Django原生的
django.db.models而非Djongo封装的djongo.models,后者已经对MongoDB的字段特性做了适配,可避免很多映射类问题。
内容的提问来源于stack exchange,提问作者Quick33
相关产品推荐
相关产品推荐

