Django按小时/天分组

4

我有一个模型:

Model.py

(这是文件名)
class DispatchPlan(models.Model):
    total_trucks = models.IntegerField(default=0)
    material_type = models.CharField(max_length=255, default=0, choices=mtypes)
    scheduled_date = models.DateTimeField(max_length=255, default=0)
    offered_price = models.IntegerField(default=0)
    weight = models.IntegerField(default=0)

我正在尝试绘制计划日期和重量之间的图表。我想按小时分组时间戳并相应地分组重量。

我该如何做?

在SQL中,它就像是.groupby('scheduled_date')一样,但由于这是一个时间戳,我认为情况并非如此。

它应该像这样:

data = DispatchPlan.objects.all().groupby('scheduled_date')

我正在使用PostgreSQL作为我的数据库。

编辑: 我尝试过以下方法:

dataset = DispatchPlan.objects.annotate(month=TruncMonth('scheduled_date')).values('month').annotate(c=sum('weight')).values('month', 'c')

错误:

类型错误:不支持使用 + 操作符进行 int 和 str 类型的运算

1个回答

6
您需要使用Django的Sum方法,而不是Python的sum。因此,请执行以下操作:
from django.db.models import Sum

dataset = DispatchPlan.objects.annotate(month=TruncMonth('scheduled_date')).values('month').annotate(c=Sum('weight')).values('month', 'c')

看起来您想按小时进行分组,应该使用TruncHour

from django.db.models import Sum
from django.db.models.functions import TruncHour

dataset = DispatchPlan.objects.annotate( 
    hour=TruncHour('scheduled_date')
).values(
    'hour'
).annotate(
    c=Sum('weight')
).values(
    'hour', 
    'c',
)


它输出了一个月的数据:<QuerySet [{'month': datetime.datetime(2019, 5, 1, 0, 0, tzinfo=<DstTzInfo 'Asia/Kolkata' IST+5:30:00 STD>), 'c': 184000}]>,我们能否获取每天或每小时的数据? - Rahul Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接