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

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 = (
    ("Нет", "Нет"), 
    ("Изменено", "Изм."), 
    ("Отказано", "Отк."),
)

排查与解决步骤

  1. 检查数据库数据
    错误本质是系统试图将字符串Нет转换为整数id,说明数据库中某个应存储整数id的字段被写入了Нет。可能是之前修改模型时(比如将外键改为CharField,或反向操作)未清理旧数据:

    • 登录数据库(如pgAdmin、MySQL命令行),检查Card表及关联表的字段,找到存储Нет的字段。
    • 修正错误数据:将对应字段的Нет值替换为合法id,或直接删除错误数据。
  2. 重置迁移记录
    残留的迁移文件可能包含错误的字段变更逻辑,即使删除新模型也会生效:

    • 备份migrations目录下所有文件,然后删除除__init__.py外的所有迁移文件。
    • 清空数据库中的django_migrations表:执行DELETE FROM django_migrations WHERE app='你的应用名';。
    • 重新执行python manage.py makemigrations和python manage.py migrate --fake-initial重建迁移记录。
  3. 核对admin与表单配置
    admin或表单的字段配置错误可能导致数据类型不匹配:

    • 检查admin.py中CardAdmin的字段配置,确保外键字段未被错误映射为文本输入。
    • 核对form.py中表单的字段定义,确保每个字段类型与模型一致。
  4. 清空缓存
    Django缓存可能残留旧模型结构:

    • 执行python manage.py clearcache清空缓存,或重启Django服务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:45:33