django: совокупный запрос на основе временного диапазона - PullRequest
2 голосов
/ 13 ноября 2009

У меня есть следующие модели, 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')

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

Буду признателен за любые указания, как этого добиться!

Спасибо

Martin

1 Ответ

4 голосов
/ 13 ноября 2009

это выглядит так: 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')
)

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

"запрос будет включать только artscores в диапазоне дат в аннотированном сумма. "

...