如何禁用djongo默认主键?升级djongo1.3.6后重复主键报错如何解决
报错原因
djongo 1.3.6 版本默认会将所有ObjectIdField类型的字段自动标记为primary_key=True,无需显式声明。你当前的模型代码同时定义了ObjectIdField类型的_id字段,和显式标记了primary_key=True的event_id字段,相当于一个模型存在两个主键,因此触发models.E026报错。
解决方案
根据你的业务需求,任选以下一种方式修改即可:
- 不需要保留
_id字段:直接删除模型中_id = models.ObjectIdField()这一行即可。Django检测到你已经显式定义了主键字段,不会自动生成默认主键,djongo也不会额外插入_id作为主键。 - 需要保留
_id字段:给_id字段显式添加primary_key=False参数,覆盖djongo的默认逻辑,修改后的代码如下:
# some_app/some_class.py from djongo import models class Some_Class(models.Model): _id = models.ObjectIdField(primary_key=False) event_id = models.IntegerField(primary_key=True) league = models.CharField(max_length=512) event_date = models.IntegerField() event_text = models.CharField(max_length=512) event_group_id = models.IntegerField() group_name = models.CharField(max_length=512)
修改完成后重新执行makemigrations和migrate命令即可正常运行。
内容的提问来源于stack exchange,提问作者juanp_1982
相关产品推荐
相关产品推荐

