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
相关产品推荐
相关产品推荐

