在Django中,获取各种条件的多个Count

Mig*_*uel 4 python django

我正在使用 Django 2.2 开发“Admin DashBoard”

我会从一张表中计算出各种条件的“对象”并将它们发送到模板。

我的代码如下..

# model
class User(models.Model):
    uid = models.AutoField(primary_key=True)
    status = models.IntegerField(blank=True, null=True)
    created_at = models.DateTimeField(blank=True, null=True)
    created_at_unix = models.CharField(max_length=100, blank=True, null=True)
    country_code = models.IntegerField(blank=True, null=True)
    recommender_id = models.ForeignKey('self', on_delete=models.SET_NULL ,blank=True, null=True, db_column='recommender_id')
    is_agreement = models.PositiveIntegerField(blank=True, null=True)
    delete_yn = models.CharField(max_length=1, default='n')
    is_sms = models.PositiveIntegerField(blank=True, null=True)
    is_email = models.PositiveIntegerField(blank=True, null=True)
    is_push = models.PositiveIntegerField(blank=True, null=True)



def index(request):
    # New User
    user_lastweek = User.objects.filter(created_at__gte=last_monday, created_at__lte=last_sunday).count()
    user_thisweek = User.objects.filter(created_at__gte=this_monday, created_at__lte=tomorrow).count()
    user_variation = user_thisweek - user_lastweek
    # User total
    user_total_lastweek = User.objects.filter(created_at__lte=last_sunday).count()
    user_total_thisweek = User.objects.filter(created_at__lte=tomorrow).count()
    user_total_variation = user_total_thisweek - user_total_lastweek

    context = {
    'user_lastweek':user_lastweek,
    ...

    }
    return render(request, 'main/index.html', context)
Run Code Online (Sandbox Code Playgroud)

我只写了众多条件中的几个。

但我的代码每次都会导致重复的查询命中。

我需要的结果就像..

1. user_lastweek : 114
2. user_thisweek : 98
3. user_total_lastweek : 1232
4. user_total_thisweek : 1330
Run Code Online (Sandbox Code Playgroud)

仅使用一个查询或更少的查询来渲染到模板的效率如何?

Mig*_*uel 14

自己解决了..

我应该阅读更多有关 Django 文档的内容。

使用.aggregate()

test = User.objects.aggregate(
        last = Count('pk', filter=Q(created_at__lte=last_sunday)),
        this = Count('pk', filter=Q(created_at__lte=tomorrow)),
        last1 = Count('pk', filter=Q(created_at__gte=last_monday, created_at__lte=last_sunday)),
        this1=Count('pk', filter=Q(created_at__gte=this_monday, created_at__lte=tomorrow)),
    )
    print(test)
Run Code Online (Sandbox Code Playgroud)
{'last': 1011, 'this': 1018, 'last1': 38, 'this1': 1}
Run Code Online (Sandbox Code Playgroud)