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

如何修复Django admin页面出现的「Please correct duplicates」重复报错

问题修复方案

你的报错根源是模型层大量误用OneToOneField字段导致的唯一约束冲突,OneToOneField强制要求关联的两个模型实例是一一对应关系,不允许重复绑定,你当前的业务逻辑显然不满足这个限制。

具体问题点及修复方案

  • 问题1:Subject模型的instructor字段使用OneToOneField
    你当前的配置要求一个教师只能对应一门课程,当你给同一个教师分配多门课时就会触发唯一约束报错。
    修复为ForeignKey允许一个教师教授多门课:

    # 原代码
    # instructor = models.OneToOneField(Teacher, on_delete=models.CASCADE, unique=True)
    # 修改后
    instructor = models.ForeignKey(Teacher, on_delete=models.CASCADE, related_name="teach_subjects")
    
  • 问题2:Subject模型的subject_name字段使用OneToOneField
    你当前的配置要求一个学校科目(如高等数学)只能对应一门课程记录,无法实现同一科目多学期/多班级开课的需求。
    修复为ForeignKey允许同一科目被多次创建课程:

    # 原代码
    # subject_name = models.OneToOneField(SchoolSubject, on_delete=models.CASCADE, unique=True)
    # 修改后
    subject_name = models.ForeignKey(SchoolSubject, on_delete=models.CASCADE, related_name="course_records")
    
  • 可选优化点

    1. Student、Teacher模型关联User的字段命名为name极易产生误解,建议修改为user,字段语义更清晰:
    class Student(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
        id_number = models.IntegerField()
    
        def __str__(self):
            return self.user.get_full_name() if self.user.get_full_name() else self.user.username
    
    1. 如果你需要实现一门课程对应多名学生的需求,当前Subject模型的name字段(关联Student)逻辑错误,应该改为ManyToManyField关联Student,或者新增中间表存储学生选课记录。

后续操作

修改完成后执行以下命令更新数据库表结构:

python manage.py makemigrations
python manage.py migrate

如果之前已经生成过包含错误字段的迁移,且存在测试数据,可以先清空测试数据再执行迁移,避免迁移冲突。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:36:04