2016-11-04 3 views
1

У меня есть запрос, который представляет собой визиты, и теперь мне нужно отфильтровать уникальные посещения днем ​​в течение всей недели.Django uniqe по запросу dateset filtering

class Visit(models.Model): 
    user = models.ForeignKey(User) 
    created_at = models.DateTimeField(auto_now_add=True) 


week = timezone.now().date() - timedelta(days=7) 
visits = Visit.objects.filter(created_at__gte=week) 

Как я могу фильтровать посещенные запросы, чтобы получать уникальные посещения в день в течение одного недельного диапазона. Поэтому, если пользователь приходит 4 раза за один день, это одно уникальное посещение. Ожидаемый результат - целое число, которое представляет собой уникальные посещения за последнюю неделю.

ответ

2

Ниже будет создано новое поле в запросе с именем visit_date: это дата (лишенная времени) из атрибута created_at вашей модели. Используя функцию Count, мы можем сгруппировать QuerySet пользователем и дату, и подсчитать количество посещений для каждой даты:

from django.db.models import Count 

week = timezone.now().date() - timedelta(days=7) 
visits = Visit.objects.filter(created_at__gte=week)).extra({'visit_date' : 'date(created_at)'}).values('user', 'visit_date').annotate(visits_on_date=Count('pk')) 

visits QuerySet будет выглядит что-то вдоль линий:

[ 
    {'user': 1, 'visit_date': datetime.date(2016, 11, 4), 'visits_on_date': 2}, 
    {'user': 2, 'visit_date': datetime.date(2016, 11, 4), 'visits_on_date': 5}, 
    {'user': 1, 'visit_date': datetime.date(2016, 11, 3), 'visits_on_date': 7}, 
    {'user': 2, 'visit_date': datetime.date(2016, 11, 3), 'visits_on_date': 9}, 
    {'user': 1, 'visit_date': datetime.date(2016, 11, 2), 'visits_on_date': 5} 
] 

Каждый элемент в запросе относится к уникальному посещению этой даты для определенного пользователя. Вы можете определить количество уникальных посещений по:

visits.count() 

Что в этом случае будет 5.

Вы также можете использовать эту функцию, чтобы определить количество посещений конкретного пользователя делает, глядя на visits_on_date поле в запросе.

+0

Удивительно! Спасибо. – Goran

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