执行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即可。
方法二:修改模型后重新生成迁移
- 先给
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) - 删除之前生成的错误迁移文件
0002_auto_20180526_0745.py - 重新执行命令:
python manage.py makemigrations python manage.py migrate
这样就能解决migrate时的错误了,同时记得把代码里的其他小错误也修正哦!
内容的提问来源于stack exchange,提问作者Jay Suthar
相关产品推荐
相关产品推荐

