我正在尝试对查询集进行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/