You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Djongo连接MongoDB的Django项目后台无法删除对象

问题修复方案及原因说明

根本原因

MongoDB 默认使用_id字段作为主键,类型为ObjectId;而Django默认会为未显式声明主键的模型自动创建一个int类型的自增主键id,二者类型不匹配。Djongo 无法将MongoDB生成的ObjectId映射到Django要求的int类型id字段,导致读取数据时拿到的id值为None,触发后续的查询、删除报错。

具体修复步骤

  1. 修改模型代码,显式声明适配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
  1. 执行迁移命令更新数据库映射:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 20:00:00