Django报错ValueError:字段'id'期望数字却得到'Нет',无法执行makemigrations
解决Django中
ValueError: Field 'id' expected a number but got 'Нет'错误 问题描述
在Django项目中添加新模型时触发错误ValueError: Field 'id' expected a number but got 'Нет'。删除新模型后错误仍未消失,修改models.py、admin.py、form.py甚至直接删除models.py都无法解决,连makemigrations命令都无法执行。
完整错误片段
return int(value) ValueError: invalid literal for int() with base 10: 'Нет'
相关代码
当前models.py代码(不含choices定义)
class Card(models.Model): name = models.CharField("Наименование постановления" ,max_length=200) date = models.DateField("Дата вынесения:", null=True, blank=True) case_number = models.CharField("Номер дела:", max_length=40, null=True, blank=True) documents = models.URLField("Связанные документы (ссылки):", max_length=300, blank=True, null=True) trial = models.CharField("Наименование суда", max_length=37, choices=TRIALS, blank=True, null=True) instance = models.CharField("Инстанция:", max_length=12, choices=INSTANCE_CHOICES, blank=True, null=True) intial = models.CharField("Первоначальное решение первой инстанции", choices=REQUIREMENTS, blank=True, null=True, max_length=200) counter = models.CharField("Встречное решение первой инстанции", choices=REQUIREMENTS,blank=True, null=True, max_length=200) appellate = models.CharField("Решение апелляционной инстанции", choices=CHOICES, blank=True, null=True, max_length=200) cassation = models.CharField("Решение кассационной инстанции", choices=CHOICES,blank=True, null=True, max_length=200) proceeding = models.CharField("Вид судопроизводства:", max_length=16, choices=PROCEEDING_CHOICES, blank=True, null=True) first_dispute = models.CharField("Категория спора (подкатегория 1)", max_length=122, choices=FIRST_DISPUTE, blank=True, null=True) second1_dispute = models.CharField("Категория спора (подкатегория 2-1)", max_length=122, choices=SECOND1_DISPUTE, blank=True, null=True) second2_dispute = models.CharField("Категория спора (подкатегория 2-2)", max_length=122, choices=SECOND2_DISPUTE, blank=True, null=True) third_dispute = models.CharField("Категория спора (подкатегория 3)", max_length=122, choices=THIRD_DISPUTE, blank=True, null=True) review = models.CharField("История рассмотрения:", max_length=4, choices=YES_OR_NO_CHOICES, blank=True, null=True) original_claim = models.CharField("Первоначальное требование:", max_length=300, blank=True, null=True) counter_claim = models.CharField("Встречное требование:", max_length=300, blank=True, null=True) description = models.TextField("Полное постановление", default='Полное постановление отсутствует.') upload = models.FileField(upload_to="uploads/%Y/%m/%d/", blank=True, null=True) class Meta: ordering = ["-date"] def __str__(self): return self.name
包含'Нет'的choices定义
YES_OR_NO_CHOICES = ( ('Есть', 'Есть'), ('Нет', 'Нет'), ) CHOICES = ( ("Нет", "Нет"), ("Изменено", "Изм."), ("Отказано", "Отк."), )
排查与解决步骤
检查数据库数据
错误本质是系统试图将字符串Нет转换为整数id,说明数据库中某个应存储整数id的字段被写入了Нет。可能是之前修改模型时(比如将外键改为CharField,或反向操作)未清理旧数据:- 登录数据库(如pgAdmin、MySQL命令行),检查
Card表及关联表的字段,找到存储Нет的字段。 - 修正错误数据:将对应字段的
Нет值替换为合法id,或直接删除错误数据。
- 登录数据库(如pgAdmin、MySQL命令行),检查
重置迁移记录
残留的迁移文件可能包含错误的字段变更逻辑,即使删除新模型也会生效:- 备份
migrations目录下所有文件,然后删除除__init__.py外的所有迁移文件。 - 清空数据库中的
django_migrations表:执行DELETE FROM django_migrations WHERE app='你的应用名';。 - 重新执行
python manage.py makemigrations和python manage.py migrate --fake-initial重建迁移记录。
- 备份
核对admin与表单配置
admin或表单的字段配置错误可能导致数据类型不匹配:- 检查
admin.py中CardAdmin的字段配置,确保外键字段未被错误映射为文本输入。 - 核对
form.py中表单的字段定义,确保每个字段类型与模型一致。
- 检查
清空缓存
Django缓存可能残留旧模型结构:- 执行
python manage.py clearcache清空缓存,或重启Django服务。
- 执行
内容的提问来源于stack exchange,提问作者Sefora Abigail
相关产品推荐
相关产品推荐

