如何修复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")可选优化点
- 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- 如果你需要实现一门课程对应多名学生的需求,当前Subject模型的
name字段(关联Student)逻辑错误,应该改为ManyToManyField关联Student,或者新增中间表存储学生选课记录。
- Student、Teacher模型关联User的字段命名为
后续操作
修改完成后执行以下命令更新数据库表结构:
python manage.py makemigrations python manage.py migrate
如果之前已经生成过包含错误字段的迁移,且存在测试数据,可以先清空测试数据再执行迁移,避免迁移冲突。
内容的提问来源于stack exchange,提问作者Jack Junior
相关产品推荐
相关产品推荐

