我有两种型号:
Follower有1000万个查询
class Follower(models.Model):
identifier = models.BigIntegerField(
_("identifier"), unique=True, null=False, blank=False)
username = models.CharField(
_("username"), max_length=250, null=True, blank=True)
Actions有500万个查询
class ActionModel(models.Model):
target = models.ForeignKey(Follower, verbose_name=_("Target"), on_delete=models.CASCADE) # username
is_followed_back = models.BooleanField(_("Followed Back"), null=True, blank=True) # is target followed back
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
null=True,
editable=False
) # django user that performed the action
每次进入Follower的管理面板时,我都想计算每个Follower每个用户的操作数,follow_back字段为True:
def get_queryset(self, request):
...
actionmodel__user = Q(actionmodel__user=request.user)
qs = qs.annotate(
been_followed_count=Count('actionmodel', filter=actionmodel__user, distinct=True)
).annotate(
follow_back_count=Count(
'actionmodel',
filter=(actionmodel__user & Q(actionmodel__is_followed_back=True)),
distinct=True
)
)
它可以工作,但速度很慢
我猜它会过滤掉1000万追随者中的每一个。。。那么它运行10米X 5米的次数? 替代方案是什么?我不能在Follower模型上存储“been_Follower_count”和“Follower_back_count”,因为这对所有django用户都很常见,所以我可以存储这些值,或者在每次get_queryset时重新计算它们吗
目前没有回答
相关问题 更多 >
编程相关推荐