首页 > 解决方案 > Django Annotate 在某些情况下不起作用

问题描述

我有一个带有注释的 Django 查询集,可以很好地计算年/月,但由于某种原因,另一个模型的相同代码不起作用。

有效的代码:

usages = Usage.objects.all()
usages = usages.annotate(year=ExtractYear('usage_datetime'),
                            month = ExtractMonth('usage_datetime')).values('year','month').annotate(total=Count('id'))

不起作用的代码(仅计算 1):

events = Event.objects.all()
events = events.annotate(year=ExtractYear('created'),
                            month = ExtractMonth('created')).values('year','month').annotate(total=Count('id'))

第一个输出:

<QuerySet [{'year': 2020, 'month': 9, 'total': 13}, {'year': 2020, 'month': 8, 'total': 18}, {'year': 2020, “月”:7,“总计”:29},{“年”:2020,“月”:6,“总计”:31},

第二个:

<QuerySet [{'year': 2020, 'month': 8, 'total': 1}, {'year': 2020, 'month': 8, 'total': 1}, {'year': 2020, 'month': 8, 'total': 1}, {'year': 2020, 'month': 8, 'total': 1} 'total': 1}, '...(剩余元素被截断).. .']>

第二个不像第一个那样计数......不确定它可能是什么......因为唯一的区别在于模型,我认为这就是问题,所以这里是我的模型:

模型.py

class Event(models.Model):
    name = models.CharField(max_length=255)
    created = models.DateTimeField(auto_now_add=True, editable=False)
    last_updated = models.DateTimeField(auto_now=True, editable=False)
    
    class Meta:
        ordering = ('-created',)

class Usage(models.Model):
    name = models.CharField(max_length=255)
    usage_datetime = models.DateTimeField(auto_now_add=True)

编辑 这是事件正在执行的查询

SELECT django_datetime_extract('year', "EventTracker_event"."created", 'UTC') AS "year", 
       django_datetime_extract('month', "EventTracker_event"."created", 'UTC') AS "month", 
       COUNT("EventTracker_event"."id") AS "total" 
  FROM "EventTracker_event" 
 GROUP BY django_datetime_extract('year', "EventTracker_event"."created", 'UTC'), 
       django_datetime_extract('month', "EventTracker_event"."created", 'UTC'), 
       "EventTracker_event"."created" 
 ORDER BY "EventTracker_event"."created" DESC

出于某种原因创建的人正在通过....

标签: django

解决方案


从模型中删除排序解决了问题


推荐阅读