我有一个这样的模型:
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 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 版本。
我遇到了一个稍微不同的问题,因为我想按部分日期进行分组,但我认为您应该能够调整它以满足您的要求(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'