我正在尝试对查询集进行GROUP BY。我想对日期时间进行分组。所以我正在使用功能提取。

我的模型如下:

class CustomData(models.Model):
    site = models.ForeignKey(CustomModel, blank=True, null=True, on_delete=models.PROTECT)
    number = models.IntegerField(default=0)
    created = models.DateTimeField(auto_now_add=True, blank=True, null=True)

    class Meta:
        db_table = 'custom_data'


这是我的查询:

    from django.db.models.functions import (Extract, ExtractDay, ExtractHour,
        ExtractMinute, ExtractMonth, ExtractQuarter, ExtractSecond, ExtractWeek,
        ExtractWeekDay, ExtractYear
    )

    cd = CustomData.objects.filter(site=c).order_by('-id')

    cd = cd.annotate(
        year=ExtractYear('created'),
        month=ExtractMonth('created'),
        day=ExtractDay('created'),
        hour=ExtractHour('created'),
        minute=ExtractMinute('created'),
    ).values(
        'year', 'month', 'day', 'hour', 'minute'
    )

    cd = cd.annotate(number=Max('number'))

    for x in cd:
        print(x)


但是结果如下:

{'hour': None, 'minute': None, 'day': None, 'year': None, 'month': None, 'number': 15}
{'hour': None, 'minute': None, 'day': None, 'year': None, 'month': None, 'number': 17}
{'hour': None, 'minute': None, 'day': None, 'year': None, 'month': None, 'number': 28}
{'hour': None, 'minute': None, 'day': None, 'year': None, 'month': None, 'number': 97}
{'hour': None, 'minute': None, 'day': None, 'year': None, 'month': None, 'number': 11}
{'hour': None, 'minute': None, 'day': None, 'year': None, 'month': None, 'number': 19}
{'hour': None, 'minute': None, 'day': None, 'year': None, 'month': None, 'number': 7}
{'hour': None, 'minute': None, 'day': None, 'year': None, 'month': None, 'number': 8}
{'hour': None, 'minute': None, 'day': None, 'year': None, 'month': None, 'number': 12}
{'hour': None, 'minute': None, 'day': None, 'year': None, 'month': None, 'number': 15}
{'hour': None, 'minute': None, 'day': None, 'year': None, 'month': None, 'number': 41}


所有时间字段均为“无”。有谁知道发生了什么事?

谢谢

最佳答案

您已将created字段标记为可为空的字段。确保它不是NULL

queryset = CustomData.objects.filter(created__isnull=False)


考虑直接访问年,月,小时和日期的其他部分。这样,您无需使用Extract{part}函数:

x = queryset.last()
print(x.created.year, x.created.month, x.created.day, x.created.second)


另外,在形成查询集时可以使用日期部分:

x = queryset.filter(created__year='2016').last()

关于python - Django ORM ExtractDay/ExtractHour/ExtractMinute,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49999029/

10-14 18:09