Общее количество пользователей за день и за неделю

#django #django-queryset #django-orm

#джанго #django-набор запросов #django-орм

Вопрос:

Я хочу получить общее количество пользователей, присоединившихся за день и за неделю, то, что я попробовал, выглядит следующим образом

 member_in_day = User.objects.exclude(is_staff=True)
    .annotate(day=TruncDay('date_joined')).values('date_joined') 
    .annotate(total_members=Count('date_joined')) 
    .order_by('-date_joined')
member_in_week = User.objects.exclude(is_staff=True)
    .annotate(week=TruncWeek('date_joined')).values('date_joined') 
    .annotate(total_members=Count('date_joined')) 
    .order_by('-date_joined')
 

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

 <QuerySet [{'date_joined': datetime.datetime(2020, 12, 28, 16, 47, 40, 509134, tzinfo=<UTC>), 'total_members': 1}, {'date_joined': datetime.datetime(2020, 12, 23, 11, 8, 19, 241355, tzinfo=<UTC>), 'total_members': 1}, {'date_joined': datetime.datetime(2020, 12, 23, 11, 6, 14, 20673, tzinfo=<UTC>), 'total_members': 1}, {'date_joined': datetime.datetime(2020, 12, 22, 9, 25, 45, 14632, tzinfo=<UTC>), 'total_members': 1}, {'date_joined': datetime.datetime(2020, 12, 22, 9, 24, 25, 819750, tzinfo=<UTC>), 'total_members': 1}, {'date_joined': datetime.datetime(2020, 12, 20, 12, 7, 37, 59113, tzinfo=<UTC>), 'total_members': 1}]> members
 

Ответ №1:

Вы не должны использовать date_joined , но day или week после усечения, так что:

 member_in_day = User.objects.exclude(is_staff=True).values(
    day=TruncDay('date_joined')
).annotate(
    total_members=Count('date_joined')
).order_by('-day') 

То же самое с members_in_week :

 member_in_week = User.objects.exclude(is_staff=True).values(
    week=TruncWeek('date_joined')
).annotate(
    total_members=Count('date_joined')
).order_by('-week') 

Комментарии:

1. @Biju: вы этого не делаете: шаблон не должен иметь отношения к бизнес-логике, только к логике рендеринга , вы должны сделать это в представлении и передать его шаблону.

2. <Набор запросов [{‘week’: datetime.datetime(2020, 12, 28, 0, 0, tzinfo=<UTC>), ‘total_members’: 1}, {‘неделя’: дата-время.дата-время(2020, 12, 21, 0, 0, tzinfo=<UTC>), ‘total_members’: 4}, {‘week’: datetime.datetime(2020, 12, 14, 0, 0, tzinfo=<UTC>), ‘total_members’: 1}]> Участники

3. <Набор запросов [{‘day’: datetime.datetime(2020, 12, 28, 0, 0, tzinfo=<UTC>), ‘total_members’: 1}, {‘day’: datetime.datetime(2020, 12, 23, 0, 0, tzinfo=<UTC>), ‘total_members’: 2}, {‘day’: datetime.datetime(2020, 12, 22, 0, 0, tzinfo=<UTC>), ‘total_members’: 2}, {‘day’: datetime.datetime(2020, 12, 20, 0, 0, tzinfo=<UTC>), ‘total_members’: 1}]> участники

4. это текущий результат

5. @Biju: вы можете перебирать набор запросов, например {% for item in myqs %}{{ item.week }}: {{item.total_members }}{% endfor %} .