Django模型报错:object has no attribute '__state',移除类__init__仍有问题
嘿,我来帮你捋捋这个问题——你能正常初始化Product实例、调用方法都没问题,唯独save()触发报错,大概率是模型定义或者数据库相关的问题,我整理了几个最常见的排查点:
检查模型必填字段是否未赋值
你的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参数(如果允许为空的话)。排查自定义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。确认数据库迁移是否同步
如果你最近修改了模型(比如新增字段、修改字段类型),但没有生成并应用迁移文件,就会导致数据库表结构和模型定义不匹配,save时必然报错。
执行以下命令同步迁移:python manage.py makemigrations webshop python manage.py migrate webshop核对字段值与字段类型是否匹配
虽然你初始化quantity时传的是整数没问题,但其他字段可能存在类型不匹配的情况——比如给DecimalField传了字符串,给DateField传了数字。仔细核对每个字段的类型和你传入的值是否一致。一定要看具体的报错信息!
你只提到了触发报错,但没贴具体的错误内容,这是定位问题最关键的线索。比如是IntegrityError(数据库约束失败)还是ValidationError(字段验证失败)?把完整的报错栈信息贴出来,能瞬间缩小排查范围。
内容的提问来源于stack exchange,提问作者Grak

