查询 Django 模型时,如何将 Django 中的 DateTimeField 从 UTC 转换为最终用户的时区(通常是 PST)?
Posted
技术标签:
【中文标题】查询 Django 模型时,如何将 Django 中的 DateTimeField 从 UTC 转换为最终用户的时区(通常是 PST)?【英文标题】:How can I convert the DateTimeField in Django from UTC to enduser's timezone (usually PST) when querying a Django model? 【发布时间】:2019-06-10 00:58:44 【问题描述】:我正在查询连接到我的 Postgres 数据库中的表的 Django 模型,该表包含以 UTC 存储的日期时间。
我的查询代码如下所示:
query_set = table_object.objects.values()
查询集中的一列是以 UTC 表示的日期时间值。
模型如下所示:
class ops_inbox_view(models.Model):
requested_date = models.DateTimeField()
other_item = models.CharField(max_length=20)
other_item2 = models.CharField(max_length=40)
other_item3 = models.CharField(primary_key=True, max_length=10)
other_item4 = models.CharField(max_length=50)
other_item5 = models.CharField(max_length=50)
other_item6 = models.CharField(max_length=50)
我想将其转换为 PST 或在最终用户的本地时区中可靠地转换。我当前的解决方案是在将查询集加载到数据框后使用带有dt.tz_localize
和dt.tz_convert
的pandas,但我试图在应用程序的项目文件结构的一个位置找到一种易于管理的解决方案。在我的 settings.py 中,我将 TIME_ZONE
设置为 'US/Pacific'
但因为我使用的是 Pandas,所以不会自动完成到 PST 的转换,并且必须在我的 views.py 中更改许多代码行才能进行转换与熊猫。
有没有办法不使用 Pandas,而是让字段时区感知或在查询代码中进行显式转换?还在寻找时区管理和显示方面的任何其他最佳实践。将此日期时间字段提供到 html 文件中...
【问题讨论】:
不清楚您是要转换为一个指定的时区(例如TIMEZONE
),还是转换为“最终用户的本地时区”,这可能会因每个请求而异。可能的选项包括使用模型属性或方法,或定义始终返回本地化时间的自定义模型字段。
@KevinChristopherHenry 您有创建模型属性或方法或将其实现到模型字段的示例吗?我已经看到了一堆使用 .now() 的示例,但我不希望在这一分钟内填充本地时间,而是希望将数据库中的 UTC 转换为本地时区。
我找到了关于编写自定义字段的文档docs.djangoproject.com/en/2.1/howto/custom-model-fields
【参考方案1】:
您可以将 F() 与注释一起使用
from datetime import timedelta
from django.db.models import DateTimeField, ExpressionWrapper, F
table_object.objects.annotate(modified_date=ExpressionWrapper(F('requested_date')+timedelta(minutes=960), output_field=DateTimeField())).filter(modified_date='2019-11-30')
在这里您需要 +/- 分钟来将 utc 日期时间转换为您的 (PST) 时区,它会将转换后的日期存储到 modofied_date 中,之后我们可以对其进行过滤。
注意:
【讨论】:
【参考方案2】:您不需要使用 pandas 来转换时区。 Django 内置了很好的时区管理工具。 他们的timezone docs 也很好,所以我建议您通读一遍。
您遇到的问题与one described in their docs 非常相似
【讨论】:
我已经尝试了很多,尤其是模板标签。只是想弄清楚如何根据查询代码 timezone.make_aware() 使用时区方法,因为 make_aware() 不需要一系列(必须遍历返回的查询集) 无论如何,您都需要遍历查询集以呈现数据。使用内置的date
template filter 来控制日期的呈现方式。以上是关于查询 Django 模型时,如何将 Django 中的 DateTimeField 从 UTC 转换为最终用户的时区(通常是 PST)?的主要内容,如果未能解决你的问题,请参考以下文章
Django 查询模型 - GROUP BY、MIN、MAX
如何减少 Django 在查询子模型属性时进行的数据库调用次数?