2

У меня есть следующие модели, искусство и 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 за пределами диапазона дат.

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

Спасибо,

Martin

ответ

4

это выглядит, как в соответствии с этим: 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 в диапазоне дат в аннотированном сумма. "

+0

Вы правы, это работает, получается ...! благодаря! – Hoff

Смежные вопросы