mysql中django queryset extra()中的日期格式

时间:2017-07-17 09:38:36

标签: python mysql django

Sales(models.Model):
    # ... ommitted fields...
    amount = models.DecimalField(...)
    date = models.DateTimeField(...)

我使用此查询过滤销售数据与一个月内的总销售额

Sales.objects.all()
    .extra(select={'month': 'MONTHNAME(date)'})
    .values('month')
    .annotate(total=SUM('amount'))
    .values('month', 'total')

输出如下:

[
    {
        "total": 186.0,
        "month": "July"
    },
    {
        "total": 278.0,
        "month": "August"
    }
]

但我想要的是将月份名称格式化为3个字母,只显示如下:'Jul''Aug'.extra(select={'month': 'DATE_FORMAT(date, '%b')'})不起作用。

Django:v1.10 +

数据库:MySQL

2 个答案:

答案 0 :(得分:1)

我检查了.extra(select={'month': "DATE_FORMAT(date, '%b')"}),似乎您需要在%之前额外b,这将以3个字母为您提供月份。 Django ticket

中存在类似的问题

对于今天的日期,.extra(select={'month': "DATE_FORMAT(date, '%%b')"})打印 7月

更好如果您想避免使用extra并创建数据库无关解决方案,那么您可以使用TruncMonth

sales_data = Sales.objects
        .annotate(month=TruncMonth('date', tzinfo=pytz.timezone('Asia/Calcutta')))

print sales_data.month.strftime('%b')  # Prints Jul

答案 1 :(得分:0)

很奇怪,但格式化字符串中需要%%。此外,如果连接上的列名不明确,则可能必须指定表(任务)。

tasks = tasks.extra(
  select={
    'lastModified':
      "DATE_FORMAT(%s.lastModified, '%s')" % (
        Task._meta.db_table,
        '%%m-%%d-%%Y',
      ),
    'dateRequested': "DATE_FORMAT(dateRequested, '%%m-%%d-%%Y')",
    'dateCompleted': "DATE_FORMAT(dateCompleted, '%%m-%%d-%%Y')",
  },
)