代码之家  ›  专栏  ›  技术社区  ›  Lemayzeur

Django查询集中按月份和性别分组

  •  1
  • Lemayzeur  · 技术社区  · 6 年前

    我有以下查询集,它与 按月分组 .

    from django.db.models.functions import TruncMonth
    
    queryset = UserProfile.objects.filter(date_created__year='2018')\
               .annotate(date=TruncMonth('date_created'))\
               .values('date').annotate(total_entries=Count('id'))
    

    我要的是分组 性别 ,这里有一个类似的模型 gender 领域

    class UserProfile:
        date_created = models.DateTime(auto_now_add=True)
        gender = models.CharField(max_length=3,choices=[('F',"Female"),('M',"Male")],default='M')
    

    预期结果:

    May: 5 users [4(Male), 1(Female)]
    June: 20 users [15(Male), 5(Female)]
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   trixn    6 年前

    用于 django < 2.0 你可以用 Conditional Expressions Sum() 要注释所需的值,请执行以下操作:

    from django.db.models import Sum, Case, When
    from django.db.models.functions import TruncMonth
    
    queryset = UserProfile.objects.filter(date_created__year='2018').annotate(
        date=TruncMonth('date_created'),
    ).values('date').annotate(
        total_entries=Count('id'),
        total_male=Sum(Case(When(gender='M', then=1), default=0, output_field=models.IntegerField())),
        total_female=Sum(Case(When(gender='F', then=1), default=0, output_field=models.IntegerField())),
    )
    

    django 2.0 你可以用 Conditional Aggregation 以下内容:

    from django.db.models import Count, Q
    from django.db.models.functions import TruncMonth
    
    queryset = UserProfile.objects.filter(date_created__year='2018').annotate(
            date=TruncMonth('date_created'),
        ).values('date').annotate(
            total_entries=Count('id'),
            total_male=Count('id', filter=Q(gender='M')),
            total_female=Count('id', filter=Q(gender='F')),
    )