序列化Queryset - 按日期分组

时间:2013-12-03 01:12:27

标签: django django-queryset django-serializer

我的模型看起来像是:

class Deal(models.Model):
    sender = models.ForeignKey(settings.AUTH_USER_MODEL)
    created_on = models.DateField(auto_now_add=True)
    recipient = modes.ForeignKey(settings.AUTH_USER_MODEL)
    ...

我想知道特定用户在今天结束的三个月窗口中发送或接收的每日交易数量。为了使事情更复杂,我希望以JSON格式序列化数据集,以便输出如下:

{
    "timestamp_1": count_1,
    "timestamp_2": count_2,
    ...
    "timestamp_n": count_n
}

到目前为止,我已经得到了一个看起来像这样的查询:

# Assume we have a user object called "user"
Deal.objects.filter(Q(sender=user) | Q(recipient=user)).extra({'date_created' : "date(created_on)"}).values('date_created').annotate(created_count=Count('id'))

仍在梳理文档,但有没有人有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

我不认为Django可以在没有RAW sqls的情况下处理这个问题。有一个很棒的django第三方软件包django-qsstats-magic,它旨在制作重复性任务,例如随着时间的推移生成查询集的聚合统计信息更容易。它支持postgresql,Mysql和sqlite。

以下代码解决了您的问题。

import qsstats
import datetime

Deal.objects.filter(Q(sender=user) | Q(recipient=user))

qss = qsstats.QuerySetStats(qs, date_field='date_created', aggregate=Count('id'))

three_month_ago = datetime.datetime.now() - datetime.timedelta(months=3)
qss.time_series(start=three_month_ago, interval='days')