Django模型date_added显示为1900年1月1日的问题及解决
问题解决方法
问题根源
你犯了两个关键错误:
- 字段类型选错:用
TimeField存储创建时间,但TimeField只保存时、分、秒,不包含日期,数据库会自动给所有记录填充默认日期1900-01-01,导致所有主题日期一致,自然无法按时间排序。 - 排序字段名写错:视图里的
order_by("date-added")是错的,应该用下划线连接的date_added。
修复步骤
1. 修改模型字段类型
把TimeField改成DateTimeField,它能同时存储日期和完整时间戳,auto_now_add=True会自动记录对象创建的准确时间:
class Topic(models.Model): """A topic the user is learning about""" text = models.CharField(max_length=200) # 替换TimeField为DateTimeField date_added = models.DateTimeField(auto_now_add=True) def __str__(self): """Return a string representation of the model""" return self.text
2. 执行数据库迁移
在项目根目录下运行以下命令,更新数据库表结构:
python manage.py makemigrations python manage.py migrate
3. 修正视图中的排序代码
把错误的date-added改成正确的date_added:
topics = Topic.objects.order_by("date_added")
4. 验证修复结果
在Django Shell里重新查询,就能看到正确的日期时间了(注意修正strftime里的$H为%H的笔误):
for topic in Topic.objects.order_by("date_added"): print(topic, topic.date_added.strftime("%d.%m.%Y %H:%M:%S"))
关于已有数据的说明
之前用TimeField存储的记录,日期部分是1900-01-01,迁移后这些记录的date_added会变成1900-01-01 原时间。如果需要修正这些旧记录的日期,你可以手动批量更新,或者根据实际情况忽略(新创建的主题会自动使用正确的当前日期时间)。
内容的提问来源于stack exchange,提问作者user19712456
相关产品推荐
相关产品推荐

