Django后台添加Simple模型时报错:getattr(): attribute name must be string
解决办法
根据报错栈信息,问题出在模型的日期唯一性校验环节:getattr(self, unique_for)中的unique_for不是字符串类型,导致调用失败。Admin界面会触发完整的表单校验(包括validate_unique),而shell中直接save()默认不会自动执行完整校验,所以出现差异。
排查步骤:
检查模型字段配置
仔细核对Simple模型的所有字段,确认是否有字段设置了unique_for_date/unique_for_month/unique_for_year参数,且参数值为字符串类型(对应日期字段的名称)。
错误示例(会触发该报错):# 错误:将类而非字符串传给unique_for_date created_at = models.DateTimeField(unique_for_date=Inner)正确示例:
# 正确:指定日期字段名称字符串 created_at = models.DateTimeField() name = models.CharField(max_length=200, unique_for_date='created_at')清理并重新生成迁移文件
如果确认模型配置无误,但问题仍存在,可能是迁移文件残留了错误配置:- 删除
migrations目录下除__init__.py外的所有文件 - 运行命令重新生成迁移:
py manage.py makemigrations py manage.py migrate
- 删除
检查Admin配置(可选)
若上述步骤无效,查看admin.py中SimpleAdmin的配置,确认是否自定义了表单或校验逻辑,导致触发异常的校验流程。
内容的提问来源于stack exchange,提问作者aaaa
相关产品推荐
相关产品推荐

