Django:按日期时间字段上的日期分组

问题描述 投票:0回答:2

我有一个这样的模型:

class Transaction(models.Model):
    amount = models.FloatField()
    seller = models.ForeignKey(User, related_name='sells', on_delete=models.CASCADE)
    buyer = models.ForeignKey(User, related_name='purchased', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

我想按每个日期分隔的所有交易进行分组并找到其中的一些交易。如果

created_at
属于
DateField
类型,我可以通过此查询简单地找到每天的计数:

Transaction.objects..values('created_at').annotate(count=Count('created_at_date')

但这不起作用

DateTimeFeilds

我的问题是如何找到此模型类型每个日期的交易总数。

django django-models django-orm
2个回答
16
投票

以下内容适用于 django 2.1 及更高版本。

 Transaction.objects.values('created_at__date').annotate(count=Count('id')).values('created_at__date', 'count').order_by('created_at__date')

您需要在名称后使用

__date
进行查找,并且需要在末尾添加
order_by

不确定以前的 django 版本。


0
投票

我遇到了一个稍微不同的问题,因为我想按部分日期进行分组,但我认为您应该能够调整它以满足您的要求(Django 3.2+)。额外奖励:可与 MySQL 配合使用。

queryset = Viewlog.objects.all().values(
    year_month=Func(
        F('date'),
        Value('%Y-%m'),
        function='DATE_FORMAT',
        output_field=CharField())
    ).annotate(total=Count('year_month')).order_by('-year_month').distinct()

针对您的特定用途:

Transaction.objects.all().values(year_month_day=Func(
        F('date'),
        Value('%Y-%m-%d'),
        function='DATE_FORMAT',
        output_field=CharField())
    ).annotate(total=Count('year_month_day')).order_by('-year_month_day').distinct()

对于其他数据库,您需要更改

function='DATE_FORMAT'

改编自:django queryset.values_list() 中日期时间字段到字符串的转换

© www.soinside.com 2019 - 2024. All rights reserved.