2013-12-03 2 views
0

У меня есть модель, которая выглядит примерно так:Serialize QuerySet - Группа по дате

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

Я не думаю, что 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') 
+0

Чтение об этом сейчас. Возвращает ли метод time_series сопроводительные метки времени (для дня)? Похоже, он возвращает только числа. – parsenz

+0

time_series возвращает список кортежей. Каждый кортеж содержит 2 элемента: объект datetime, который представляет начало сериала и итоговый результат. –