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

Django模型报错:object has no attribute '__state',移除类__init__仍有问题

解决Django模型save()方法报错的常见排查方向

嘿,我来帮你捋捋这个问题——你能正常初始化Product实例、调用方法都没问题,唯独save()触发报错,大概率是模型定义或者数据库相关的问题,我整理了几个最常见的排查点:

  1. 检查模型必填字段是否未赋值
    你的Product模型可能存在一些null=False且blank=False的必填字段,但你初始化toy1的时候没给这些字段传值。比如如果模型里有price(DecimalField)或者category(ForeignKey)这类必填项,没赋值的话Django在save时会直接抛出验证错误。
    举个错误示例:

    # 你的Product模型可能有这样的必填字段
    class Product(models.Model):
        title = models.CharField(max_length=100)
        description = models.TextField()
        quantity = models.IntegerField()
        price = models.DecimalField(max_digits=10, decimal_places=2)  # 必填但初始化未传值
    

    解决办法要么给toy1补上缺失的字段值,要么根据业务需求给字段添加null=True或blank=True参数(如果允许为空的话)。

  2. 排查自定义save()方法的逻辑错误
    如果你在Product模型里重写了save()方法,很可能是里面的逻辑出了问题——比如漏掉了调用父类的save方法,或者处理字段时抛出了异常。比如:

    # 错误示例:未调用父类save方法
    def save(self, *args, **kwargs):
        self.quantity = max(0, self.quantity)  # 假设你加了库存校验逻辑
        # 这里漏掉了关键的一行:
        super().save(*args, **kwargs)
    

    检查下你的自定义save方法,确保正确调用了super().save(*args, **kwargs),并且没有语法或逻辑上的bug。

  3. 确认数据库迁移是否同步
    如果你最近修改了模型(比如新增字段、修改字段类型),但没有生成并应用迁移文件,就会导致数据库表结构和模型定义不匹配,save时必然报错。
    执行以下命令同步迁移:

    python manage.py makemigrations webshop
    python manage.py migrate webshop
    
  4. 核对字段值与字段类型是否匹配
    虽然你初始化quantity时传的是整数没问题,但其他字段可能存在类型不匹配的情况——比如给DecimalField传了字符串,给DateField传了数字。仔细核对每个字段的类型和你传入的值是否一致。

  5. 一定要看具体的报错信息!
    你只提到了触发报错,但没贴具体的错误内容,这是定位问题最关键的线索。比如是IntegrityError(数据库约束失败)还是ValidationError(字段验证失败)?把完整的报错栈信息贴出来,能瞬间缩小排查范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:28:11