【补充小知识】USE_TZ和更新数据
【补充小知识】USE_TZ和更新数据
【1】USE_TZ = False写成true,和fasle的区别
介绍
- USE_TZ = False 和 USE_TZ = True 的区别在于是否启用时区支持。
- 当将 USE_TZ 设置为 False 时,Django 将以系统默认的时区进行操作。
- 这意味着 Django 会假设所有时间都是以服务器本地时区表示的,数据库中的日期时间字段也会被视为无时区(naive)。
- 而当将 USE_TZ 设置为 True 时,Django 将启用时区支持。
- 这意味着 Django 会假设所有时间都是以时区感知(aware)的方式存储和处理的。
- 在这种情况下,Django 将使用 TIME_ZONE 设置来确定默认的时区。
- 使用 USE_TZ = True 可以确保在多个时区之间正确地转换时间,并在处理跨时区的日期时间时提供一致性。
示例的演示:
- 假设我们的 TIME_ZONE 设置为 'Asia/Shanghai'。
当 USE_TZ = False 时:
- 我们有一个保存在数据库中的日期时间字段: 2023-08-08 10:00:00
- Django 将会把它解释为服务器本地时区的时间,在这个例子中是东八区(Asia/Shanghai),即 2023-08-08 10:00:00。
- Django 不会进行任何时区转换。
当 USE_TZ = True 时:
- 我们有一个保存在数据库中的日期时间字段: 2023-08-08 10:00:00
- Django 将会把它解释为时区感知的时间,而不是简单地将其视为本地时间。
- 当我们从数据库中提取出该时间字段时,Django 将会将其转换为 UTC 时间(协调通用时间): 2023-08-08 02:00:00(假设服务器本地时区处于东八区)。
- 在处理这个时间字段时,Django 将确保正确的时区转换,例如根据用户设定的时区将其转换为用户所在的时区进行展示。
- 因此,使用 USE_TZ = True 可以更好地处理多个时区的情况,并确保在跨时区操作时的一致性和准确性。
【2】auto_now/update更新,象.属性=xx
- auto_now 和 update 的区别在于触发更新操作的时机和方式。
auto_now:
- 当某个字段设置为
auto_now=True
时,每次调用对象的 save() 方法保存到数据库时,该字段都会被更新为当前时间。 - 这意味着无论是创建记录还是更新记录,只要执行了 save() 操作,被设置为 auto_now 的字段就会被更新为当前时间。
- auto_now 可应用于 DateField、DateTimeField 和 TimeField 字段类型。
update:
- 当使用
对象.属性 = 值
进行属性赋值,并调用对象的 save() 方法保存到数据库时,数据库中对应的记录会被更新。 - 这种更新方式可以在代码的任何地方执行,并不局限于执行 save() 方法时才会触发。
- 此种方式可以同时更新多个字段的值。
- update 不会更新任何自动填充(auto-fill)字段或自动更新(auto-update)字段。
示例
- 假设我们有一个模型类
Article
,其中有两个字段:title
和last_modified
。
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
last_modified = models.DateTimeField(auto_now=True)
创建一个 Article 对象并对其进行更新:
article = Article.objects.create(title='Example Article')
article.title = 'Updated Article'
article.save()
- 在这个例子中,我们首先创建了一个
Article
对象,并设定了title
为 'Example Article'。 - 接下来,我们将
title
修改为 'Updated Article'。 - 当调用
article.save()
方法保存对象时,last_modified
字段会被更新为当前时间。
使用 update 的方式进行更新:
Article.objects.filter(pk=1).update(title='Updated Article')
- 这个例子中,我们通过使用
filter()
方法来获取 ID 为 1 的Article
对象,然后使用update()
方法将title
更新为 'Updated Article'。 - 这种方式不会触发
auto_now
的特性,因此last_modified
字段不会被更新为当前时间。
总结:
- auto_now 适用于需要在每次保存时更新时间的场景,如记录最后修改时间的字段。
- update 可以在不保存整个对象的情况下快速更新数据库记录的字段值。
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17642777.html