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

Djongo未使用Django模型中显式设置的主键问题求助

问题原因及解决方案

1. MongoDB的_id是强制必填字段

MongoDB要求每个文档必须包含_id字段,这是数据库层面的硬性约束,无法移除。你在Mongo Compass中看到的“默认id字段”其实是MongoDB内置的_id,而非Django生成的默认主键。你的自定义主键(如playerId、matchID)会作为独立的业务字段存在,但_id仍会被自动创建。

2. Django-Mongo适配器的主键映射逻辑

如果你使用djongo或其他Django-MongoDB适配器,默认情况下,即使给自定义字段设置了primary_key=True,适配器仍会保留MongoDB的_id字段,同时将你的自定义主键标记为唯一索引字段,而非替换_id。

如果希望自定义主键的值直接作为MongoDB的_id,需要修改模型字段名为_id并设置primary_key=True,示例:

class SearchPlayers(models.Model):
    _id = models.CharField(primary_key=True, max_length=50)  # 用自定义值作为Mongo的_id
    # 其他业务字段...

3. 模型定义存在疏漏

检查所有模型的自定义主键字段是否正确添加了primary_key=True参数,示例:

class Matches(models.Model):
    matchID = models.CharField(primary_key=True, max_length=100)
    # 其他字段...

如果遗漏该参数,Django会自动生成默认的id字段,同时Mongo的_id也会正常生成,导致你看到的“默认主键”问题。

4. 适配器版本或配置问题

部分旧版本的Django-Mongo适配器对自定义主键的支持不完善,建议检查适配器版本是否为最新稳定版。同时确认settings.py中的数据库配置是否正确,比如djongo的配置是否正确指定了连接参数,没有强制启用自动生成_id的额外选项。


内容的提问来源于stack exchange,提问作者ssHUKLaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:05:12