保存Owner时触发Django非空约束错误:不存在的doc_name字段
问题描述
调用.save()保存Owner对象时触发如下错误:
django.db.utils.IntegrityError: NOT NULL constraint failed: doctor_owner.doc_name
但doc_name字段并未定义在Owner模型中,无法理解错误原因。
模型定义
from django.db import models # Create your models here. from base.models import BaseModel class Owner(BaseModel): owner_id = models.CharField(max_length=50) owner_name = models.CharField(max_length=250) class Pet(BaseModel): owner = models.ForeignKey(Owner, on_delete=models.CASCADE) pet_name = models.CharField(max_length=100) pet_age = models.DecimalField(max_length=3, decimal_places=2, max_digits=50) pet_specie = models.CharField(max_length=250) pet_gender = models.CharField(max_length=1) class Medicine(BaseModel): medicine_name = models.CharField(max_length=250) frequency = models.CharField(max_length=100) duration = models.CharField(max_length=100) class Prescription(BaseModel): pet = models.ForeignKey(Pet, on_delete=models.CASCADE) medicine = models.ForeignKey(Medicine, on_delete=models.CASCADE) class Treatment(BaseModel): pet = models.ForeignKey(Pet, on_delete=models.CASCADE) owner = models.ForeignKey(Owner, on_delete=models.CASCADE) doc_name = models.CharField(max_length=250) prescription = models.ForeignKey(Prescription, on_delete=models.CASCADE)
问题分析与解决方案
错误中的doctor_owner是Django自动生成的数据库表名(格式为应用名_模型名,这里应用应为doctor),问题核心是数据库表结构与当前模型定义不一致:
大概率是历史迁移残留:之前你可能给
Owner模型添加过doc_name字段并执行了迁移,后续删除该字段时未正确同步数据库(比如没生成新迁移、没执行迁移,或迁移文件被误删),导致数据库中doctor_owner表仍保留doc_name字段,且带有NOT NULL约束,保存Owner时触发约束校验错误。解决步骤:
- 直接查看数据库的
doctor_owner表结构,确认是否存在doc_name字段; - 若存在,生成新的迁移文件:
python manage.py makemigrations; - 执行迁移更新数据库:
python manage.py migrate; - 如果迁移流程异常,可手动修改数据库表删除
doc_name字段(操作前务必备份数据)。
- 直接查看数据库的
另外可排查是否有信号、钩子代码在保存Owner时自动创建关联的Treatment对象,但错误明确指向doctor_owner.doc_name,优先处理数据库与模型的一致性问题。
内容的提问来源于stack exchange,提问作者HQuser
相关产品推荐
相关产品推荐

