Django中如何设置固定datetime.now()变量避免文章创建日期每次更新重置
问题根因
你当前的写法存在两处核心错误:
- 没有将日期属性定义为Django ORM要求的
DateTimeField字段类型,直接赋值为Python原生datetime对象,完全不符合模型字段的定义规范 - 直接写死
datetime.now()会在Django项目启动加载模型类时就计算出一个固定时间,不会在每条记录创建、更新时动态生成时间
解决方案
Django的DateTimeField内置了专门的参数用来区分创建时间和更新时间,不需要自己手动处理时间赋值逻辑:
auto_now_add=True:仅在对象第一次写入数据库时自动写入当前时间,后续修改对象时不会更新该字段值,完全满足创建时间的需求auto_now=True:每次对象保存(包括新增、修改)时都会自动更新为当前时间,正好对应最后编辑时间的需求
修正后的代码如下:
from django.db import models class Post(models.Model): # 此处保留你其他的字段定义 date_created = models.DateTimeField(auto_now_add=True) last_edited_date = models.DateTimeField(auto_now=True)
补充说明
如果后续你需要允许手动修改这两个时间的值,就不能使用auto_now_add和auto_now参数,可以通过重写模型的save方法实现逻辑控制,示例代码如下:
from django.db import models from datetime import datetime class Post(models.Model): # 此处保留你其他的字段定义 date_created = models.DateTimeField() last_edited_date = models.DateTimeField() def save(self, *args, **kwargs): # 首次创建对象时无主键,设置创建时间 if not self.pk: self.date_created = datetime.now() # 每次保存都更新最后编辑时间 self.last_edited_date = datetime.now() super().save(*args, **kwargs)
内容的提问来源于stack exchange,提问作者Han
相关产品推荐
相关产品推荐

