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

保存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),问题核心是数据库表结构与当前模型定义不一致:

  1. 大概率是历史迁移残留:之前你可能给Owner模型添加过doc_name字段并执行了迁移,后续删除该字段时未正确同步数据库(比如没生成新迁移、没执行迁移,或迁移文件被误删),导致数据库中doctor_owner表仍保留doc_name字段,且带有NOT NULL约束,保存Owner时触发约束校验错误。

  2. 解决步骤:

    • 直接查看数据库的doctor_owner表结构,确认是否存在doc_name字段;
    • 若存在,生成新的迁移文件:python manage.py makemigrations;
    • 执行迁移更新数据库:python manage.py migrate;
    • 如果迁移流程异常,可手动修改数据库表删除doc_name字段(操作前务必备份数据)。

另外可排查是否有信号、钩子代码在保存Owner时自动创建关联的Treatment对象,但错误明确指向doctor_owner.doc_name,优先处理数据库与模型的一致性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:01:20