如何使用格式化的日期时间字段获取 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 查询集结果的主要内容,如果未能解决你的问题,请参考以下文章