【问题标题】:How to get django queryset results with formatted datetime field如何使用格式化的日期时间字段获取 django 查询集结果
【发布时间】: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')

如何解决这个问题?

【问题讨论】:

    标签: python django datetime django-models


    【解决方案1】:

    通过@Yannics 的回答解决了这个问题:https://stackoverflow.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,我想在没有迭代的情况下这样做
      • 这不是真的,只要你在渲染/处理数据,你总是在迭代查询集,所以即使你的解决方案有效,你也没有任何收获。另一方面,您的解决方案降低了代码的可读性并依赖于底层数据库,如果您更改数据库,您的代码可能会中断,因此它不可移植。
      猜你喜欢
      • 1970-01-01
      • 2014-08-05
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多