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

Django+SQLite迁移时遇fromisoformat错误及模型不存在问题求助

Django migrate报错:TypeError: fromisoformat: argument must be str 及模型不存在问题解决

问题背景

使用Django + SQLite开发网站,通过Model实现数据库与前端数据交互,执行python3 manage.py migrate时出现以下错误:

TypeError: fromisoformat: argument must be str

经排查怀疑是日期类型模型使用不当,将datetime.date对象传入了需要字符串的fromisoformat()方法。尝试将DateField替换为CharField后,又出现模型不存在的报错,寻求解决办法。

当前Model代码

# Internal = 0, Derived = 1.

class Grade(models.Model):
    name = models.CharField(max_length=100, default="null")
    # classPage = models.ManyToManyField(classPage, related_name="_set")
    amegrade = models.CharField(max_length=10, default="null")
    description = models.CharField(max_length=500, default="null")
    type = models.BooleanField(default=1)

class Student(models.Model):
    studentName = models.CharField(max_length=50, default="null")
    age = models.CharField(default="13", max_length=3)
    house = models.CharField(max_length=10, default="null")
    bday = models.CharField(default="null", max_length=50)

class classPage(models.Model):
    teacher = models.CharField(max_length=50, default="null")
    # classStudents = models.ManyToManyField(Student, related_name="_set")

class timetableItem(models.Model):
    name = models.CharField(max_length=50, default="null")
    timeStart = models.CharField(max_length=50, default="null")
    timeEnd = models.CharField(max_length=50, default="null")
    

class dailyTimetable(models.Model):
    timetableItems = models.ManyToManyField(to=timetableItem)

class weeklyTimetable(models.Model):
    monday = models.OneToOneField(to=dailyTimetable, on_delete=models.CASCADE)

class sideViewButton(models.Model):
    name = models.CharField(max_length=100, default="null")
    directory = models.URLField(max_length=100, default="null")

class Notice(models.Model):
    title = models.CharField(max_length=50, default="null")
    description = models.CharField(max_length=10000, default="null")

解决步骤

一、处理fromisoformat类型错误

  1. 检查旧迁移文件:查看项目migrations目录下的所有文件,是否存在残留的日期字段(DateField/DateTimeField)操作逻辑。即使当前模型已经修改,旧迁移可能仍在执行日期对象转字符串的操作,导致报错。
  2. 检查数据赋值逻辑:排查项目中视图、序列化器、信号等所有给模型字段赋值的代码,确认是否有直接传入datetime.date对象的情况。即使字段改为CharField,若赋值时未将日期对象转为ISO格式字符串(比如date_obj.isoformat()),仍会触发该错误。

二、处理“模型不存在”错误

  1. 修正模型类命名:Django模型类规范采用大驼峰命名(如ClassPage而非classPage),检查是否因类名大小写不一致导致迁移文件无法找到模型。建议统一修改为大驼峰命名,重新生成迁移。
  2. 清理注释字段的残留迁移:若之前已为注释掉的字段(如Grade中的classPage多对多字段)生成过迁移,注释字段后未清理对应迁移逻辑,会导致migrate时找不到关联模型。可删除包含该字段的旧迁移文件,重新生成迁移。
  3. 检查迁移依赖:查看migrations/__init__.py及各迁移文件的dependencies,确认所有依赖的模型均存在,无引用已删除或重命名的模型。
  4. 开发环境重置迁移(谨慎操作):若为开发环境,可执行以下步骤彻底重置:
    • 删除migrations目录下除__init__.py外的所有文件;
    • 删除SQLite数据库文件(默认是db.sqlite3);
    • 重新执行python3 manage.py makemigrations生成新迁移;
    • 执行python3 manage.py migrate完成数据库同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:17:45