Django注释大数据(慢速)替代方案?

2024-09-24 22:30:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两种型号:

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时重新计算它们吗


Tags: falsetruemodelismodelscountbackusername