如何使用格式化的日期时间字段获取 django 查询集结果

Posted

技术标签:

【中文标题】如何使用格式化的日期时间字段获取 django 查询集结果【英文标题】:How to get django queryset results with formatted datetime field 【发布时间】:2016-11-28 22:38:44 【问题描述】:

我的 Django 模型具有与其他模型关联的外键。每个模型都有相同的字段名称(属性) created_at 和 updated_at

在每个 django 查询集结果中,我都会获得日期时间值。

Model.objects.all().values('created_at')

但我想将日期时间字段格式化为“DD-MM-YYYY HH:MM:SS”并减少 django 查询结果中的毫秒数。

如果我像以下命令一样使用“额外”和 date_trunc_sql

dt = connection.ops.date_trunc_sql('day','created_date')
objects.extra('date':dt).values('date')

效果很好。但是如果我像下面这样查询,它会引发模棱两可的语句错误。

objects.extra('date':dt).values('date', 'x', 'y', 'z')

如何解决这个问题?

【问题讨论】:

【参考方案1】:

通过@Yannics 的回答解决了这个问题:https://***.com/a/60924664/5804947

这也避免了使用 extra,由于 Django 文档,这应该是“最后的手段”。

from django.db.models import F, Func, Value, CharField

qs.annotate(
  formatted_date=Func(
    F('created_at'),
    Value('DD-MM-YYYY HH:MM:SS'),
    function='to_char',
    output_field=CharField()
  )
)

【讨论】:

【参考方案2】:

找到解决方案。

data = list(Model.objects.extra(select='date':"to_char(<DATABASENAME>_<TableName>.created_at, 'YYYY-MM-DD hh:mi AM')").values_list('date', flat='true')

不只是tablename.attribute,当我们有多个数据库时应该是dbname_tablename.attribute(不明确)

这将导致 created_at 日期时间值列表修剪为 'YYYY-MM-DD HH:MM' 格式。

【讨论】:

很好的答案,但应该是 appname_modelname 或只是 tablename 如果没有关系就不需要表名【参考方案3】:

我认为values() 函数不会与格式化日期时间结果相关。但为什么这会困扰你?当您尝试显示它们时,您不能将它们转换为正确的格式吗?如果您尝试在模板中呈现它们,django 有模板过滤器date 用于格式化您的日期时间值:https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#date

【讨论】:

true,为了显示,我也在做同样的事情,但我的用例是将数据写入 pdf / csv,我想在没有迭代的情况下这样做 这不是真的,只要你在渲染/处理数据,你总是在迭代查询集,所以即使你的解决方案有效,你也没有任何收获。另一方面,您的解决方案降低了代码的可读性并依赖于底层数据库,如果您更改数据库,您的代码可能会中断,因此它不可移植。

以上是关于如何使用格式化的日期时间字段获取 django 查询集结果的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver 如何把查出来的日期变成字符串格式

django 频道更改日期时间字段的时间格式

sqlserver 如何把查出来的日期变成字符串格式

django中的日期格式日期字段

Django 模板中的日期/时间格式

如何使用 django-import-export 为字段定义管理员导入格式