django: совокупный запрос на основе временного диапазона

У меня есть следующие модели Art и ArtScore:

class Art(models.Model):
    title = models.CharField()

class ArtScore(models.Model):
    art = models.ForeignKey(Art)
    date = models.DateField(auto_now_add = True)
    amount = models.IntegerField()

Определенные действия пользователя приводят к записи ArtScore, например, всякий раз, когда вы нажимаете «Мне нравится это искусство», я сохраняю определенное количество ArtScore для этого искусства.

Теперь я пытаюсь отобразить страницу «самая популярная на этой неделе», поэтому мне нужен запрос, объединяющий только суммы ArtScore для этого временного диапазона.

Я построил приведенный ниже запрос, но он ошибочен...

popular = Art.objects.filter(
    artscore__date__range=(weekago, today)
).annotate(
    score=Sum('artscore__amount')
).order_by('-score')

... потому что он исключает только искусство, для которого нет записи ArtScore в диапазоне дат, но не исключает записи ArtScore за пределами диапазона дат.

Любые указатели, как это сделать, будут оценены!

Спасибо,

Мартин


person Hoff    schedule 13.11.2009    source источник


Ответы (1)


это выглядит следующим образом: http://docs.djangoproject.com/en/dev/topics/db/aggregation/#order-of-annotate-and-filter-clauses то, что у вас есть, должно делать то, что вы хотите. документация неверна? может баг?

«второй запрос будет включать в аннотированный подсчет только хорошие книги».

в связи с:

>>> Publisher.objects.filter(book__rating__gt=3.0).annotate(num_books=Count('book'))

измените это на свой запрос (забудьте о порядке сейчас):

Art.objects.filter(
    artscore__date__range=(weekago, today)
).annotate(
    score=Sum('artscore__amount')
)

теперь мы можем сказать

«запрос будет включать в аннотированную сумму только художественные оценки в диапазоне дат».

person Brandon Henry    schedule 13.11.2009