0

我有一个看起来像这样的模型:

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'))

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

4

1 回答 1

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')
于 2013-12-03T02:01:20.753 回答