Django:使用annotate(Count())替代速度的替代方案

use*_*390 6 django django-models

有两种模型具有一对多的关系,A - > {B}.我在计算使用过滤器()之后有多少AI记录与同一个B.然后我需要根据连接到它们的大多数B记录提取A的前X个记录.

目前的代码:

class A(models.Model):
    code = models.IntegerField()
    ...

class B(models.Model):
    a = models.ForeignKey(A)
    ...

data = B.objects.all().filter(...)

top = data.values('a',...).annotate(n=Count('a')).distinct().order_by('-n')[:X];
Run Code Online (Sandbox Code Playgroud)

我有~300k B记录和我的笔记本电脑,这是一个查询需要~2s.我将查询分解为部分并计时,似乎主要的瓶颈是annotate().

有没有办法用Django更快地做到这一点?

小智 0

您应该在查询集中添加.select_related('a')之前。annotate这将迫使 django 在计算模型之前加入模型。

https://docs.djangoproject.com/en/1.9/ref/models/querysets/#select-相关