我有一个像这样的简单模型:
class CurrentMonthRegisterPage(models.Manager):
"""This manager class filter with current month."""
current_date = datetime.now().date()
def get_queryset(self):
return super(CurrentMonthRegisterPage, self).get_queryset().filter(
detail_hour__month=self.current_date.month, detail_hour__year=self.current_date.year)
class RegisterPage(models.Model):
OTHERS = '4'
EXTRA_TIME = '3'
EARLIER = '2'
ON_TIME = '1'
LATE = '0'
ABSENT = '-'
STATUS_LIST = (
(LATE, _("Late")),
(ON_TIME, _("On time")),
(EARLIER, _("Earlier")),
(EXTRA_TIME, _("Extra time")),
(OTHERS, _("ND")),
(ABSENT, _("Absent")),
)
detail_hour = models.DateTimeField(_('Date and hour'), auto_now_add=True)
details_mouvement = models.TextField(_("Déscription"), blank=True)
state = models.CharField(_("Statut"), max_length=1, choices=STATUS_LIST, default=ABSENT)
objects = RecentManager()
c_month = CurrentMonthRegisterPage()
现在我想获取当月每一天的每种状态的数字
示例:
本月是三月
如何获取三月的每天的 state == LATE 个数字?
我想得到这样的东西:
queryset = [{'late':[1,1,3,5,....31], 'other_state': [1,2,...], ...}]
请帮助?
答案 0 :(得分:2)
您需要一个带有日期和状态字段的查询,然后进行计数(隐式按日期和状态分组):
from django.db.models import Count
from django.db.models.functions import Trunc
queryset = (RegisterPage.c_month
.annotate(day=Trunc('detail_hour', 'day'))
.values('day', 'state')
.annotate(count=Count('day'))
.order_by('day', 'state')
)
我添加了一个ordering子句,以删除任何现有的排序(这将阻碍所需的分组)并对结果进行排序。
结果仅包含数据中实际存在的日期和状态,如果要包含计数为0
的缺失日期或状态,则可能需要在Python代码中完成。