【问题标题】:Django ORM query for last 7 days day by day每天过去7天的Django ORM查询
【发布时间】:2020-03-26 23:06:00
【问题描述】:

这是我的模型:

class Sales(models.Model):
    title = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

我正在尝试获取最近 7 天的数据,例如我想查看上周五、周六、周一等日期发生了多少销售。

仅在过去 7 天,但应该每天都出现,

喜欢:

friday: 40
mondey:80
widnesday: 88 etc date

我不知道如何做到这一点......

我在下面尝试过这样的:

some_day_last_week = timezone.now().date() - timedelta(days=7)    
sales = Sales.objects.filter(
            created_at__gte=some_day_last_week,
        ).values(
            'created_at__date'
        ).annotate(
            created_count=Count('created_at__date')
        )

谁能帮我处理这个案子?

【问题讨论】:

  • 打印sales_by_day时得到什么?
  • 我按日期获取数据
  • 但我想要一个字典列表中的日期,例如 if friday: 80, monddy: 90 etc
  • @wow 请检查我的答案。

标签: django django-models django-rest-framework django-orm


【解决方案1】:

您需要在您的情况下使用 TruncDay:

from django.db.models.functions import TruncDay

sales = Sales.objects.filter(
            created_at__gte=some_day_last_week,
        ).annotate(
            day=TruncDay('created_at')
            created_count=Count('created_at__date')
        ).values(
            'day',
            'created_count',
        )

结果你会得到:

[
    {'day': datetime.date(2019, 12, 1), 'created_count': 4.0}, 
    {'day': datetime.date(2019, 12, 2), 'created_count': 10.0},
    {'day': datetime.date(2019, 12, 3), 'created_count': 5.0},
    {'day': datetime.date(2019, 12, 4), 'created_count': 1.0},
    {'day': datetime.date(2019, 12, 5), 'created_count': 8.0},
    {'day': datetime.date(2019, 12, 6), 'created_count': 4.0},
]

为了获得日期名称,您可以使用date.strftime("%A") 转换日期时间对象:

for i in result:
    print(i['day'].strftime("%A"))

# result 
Sunday
Monday
...
Friday

【讨论】:

    猜你喜欢
    • 2014-08-10
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多