Django默认时间为项目的启动时间

项目上线运行几天了,在后台新增数据时突然发现创建日期不正常,显示的日期并不是当天日期。经过比对发现是项目初始化的日期(Django跑起来的那天),我的 models 是这样写的:

create_time = models.DateField('创建日期', default=datetime.datetime.now().date())

因为该字段有需改需求,所以没用 auto_now、auto_now_add。
之后改用 date.today() ,问题依旧存在。

create_time = models.DateField('创建日期', default=datetime.date.today())

改用 timezone 也显示报错,百度有说修改 setting 配置的,需要 USE_TZ = True ,查看了一下我的配置:

# 配置语言
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False

要是修改 USE_TZ = True 就不是本地时间了。。。

之后又找了半天,看到有文章说,default=datetime.now() 这种用法是错误的,除非想设置动态默认时间为项目的启动时间。好吧,就是这个了。

# create_time = models.DateField('创建日期', default=datetime.date.today())
create_time = models.DateField('创建日期', default=datetime.date.today)

OK,解决了!!!



追加:一、django设置字段动态默认时间的四种方式

create_time_one = models.DateTimeField('创建时间', default=datetime.now())
update_time_one = models.DateTimeField('更新时间', default=datetime.now)
 
create_time_tow = models.DateTimeField('创建时间', auto_now_add=True)
update_time_tow = models.DateTimeField('更新时间', auto_now=True)

1、default=datetime.now()
model每次初始化,都会自动设置该字段的默认值为初始化时间。

2、default=datetime.now
model每次进行新增或修改操作,都会自动设置该字段的值为操作时间。设置后仍可以使用ORM手动修改该字段。

3、auto_now_add=True
默认值为False,若设置为True,model每次进行新增操作,都会自动设置该字段的值为操作时间。设置为True后无法使用ORM手动修改该字段,哪怕填充了字段的值也会被覆盖。

4、auto_now=True
默认值为False,若设置为True,model每次进行新增或修改操作,都会自动设置该字段的值为操作时间。设置为True后无法使用ORM手动修改该字段,哪怕填充了字段的值也会被覆盖。

5、要注意的点
除非想设置动态默认时间为项目的启动时间,否则default=datetime.now()这种用法是错误的,会得到期望之外的结果。
使用User.objects.update方法时,设置的default=datetime.now和auto_now=True都不会生效,由于设置了auto_now=True的字段不能手动修改,此时只能使用save方法修改数据,这对于多个数据的更新是不友好的。

因此如果设置动态默认时间的字段,应该使用default=datetime.now和auto_now_add=True来实现。


二、null=True和blank=True的区别
1、null针对数据库,如果null=True,表示数据库的该字段可以为空。
2、blank针对表单的,如果blank=True,表示表单填写该字段时可以不填。

mysql中空值不占用空间,NULL占用空间,而且使用NULL会使索引的效率下降。因此从性能上来说,不建议使用null=True,最好使用default=’’。


三、save和build_create的区别
bulk_create的优点:
批量操作时只与数据库进行一次交互,效率高。
bulk_create的缺点:
对于设置了自增的字段,返回值中不会有该字段的值,如上例2中的user对象。
对于设置了动态默认时间的字段,如设置了auto_now=True,同一批处理的记录中该字段的时间将会相同。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值