【补充小知识】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,其中有两个字段:titlelast_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 可以在不保存整个对象的情况下快速更新数据库记录的字段值。
posted @ 2023-08-19 17:29  Chimengmeng  阅读(126)  评论(0编辑  收藏  举报