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

执行Django migrate时触发TypeError: expected string or buffer错误求助

解决Django migrate时出现的TypeError: expected string or buffer问题

嘿,我来帮你排查这个问题!从你给出的报错信息和代码来看,这个错误确实和字段的默认值设置有关,同时你的代码里还有几个小问题需要一起修正。

核心错误原因

看报错栈的最后几行:

File "/usr/local/lib/python2.7/dist-packages/django/utils/dateparse.py", line 60, in parse_date
    match = date_re.match(value)
TypeError: expected string or buffer

这说明Django在尝试解析publish字段的默认值时,拿到的不是一个能被解析成日期的字符串。你的Post模型里publish字段的定义是:

publish = models.DateField(auto_now=False, auto_now_add=False)

这个字段既没有设置default,也没有允许为空(null=True/blank=True),当你执行makemigrations时,Django应该会提示你给已有数据设置一个默认值——如果你当时输入的不是合法的日期字符串(比如直接回车、输入了数字或者格式不对的内容),就会导致迁移时出现这个错误。

代码里的其他问题(必须修正)

除了migrate的问题,你的代码还有几个小错误,不修正后续会出问题:

  • models.py里的拼写错误:
    • __unicodde__函数名拼错了,应该是__unicode__(少了一个e)
    • 这个函数里return self.Title的Title要改成self.title,因为你的字段是小写的title
  • forms.py里的字段不匹配:
    • 表单的fields里写了"Content",但你的Post模型根本没有这个字段,要么在模型里添加content = models.TextField(),要么把表单里的"Content"删掉。

修复migrate错误的两种方法

方法一:直接修改迁移文件

找到posts/migrations/目录下的0002_auto_20180526_0745.py文件,找到关于publish字段的定义部分,把默认值改成一个合法的日期字符串,比如:

field=models.DateField(default='2018-05-26', auto_now=False, auto_now_add=False),

保存后重新执行python manage.py migrate即可。

方法二:修改模型后重新生成迁移

  1. 先给publish字段设置允许为空或者默认值:
    # 允许字段为空(推荐,如果你不想强制设置发布日期)
    publish = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)
    # 或者设置一个默认日期,比如当前日期
    from django.utils.timezone import now
    publish = models.DateField(auto_now=False, auto_now_add=False, default=now)
    
  2. 删除之前生成的错误迁移文件0002_auto_20180526_0745.py
  3. 重新执行命令:
    python manage.py makemigrations
    python manage.py migrate
    

这样就能解决migrate时的错误了,同时记得把代码里的其他小错误也修正哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:02:51