使用带有 Django annotate 的自定义查询

问题描述 投票:0回答:1

在注释中。统计记录时,如何使用自定义查询来缩小统计范围?

class User(models.Model):
    name = models.CharField(max_length=50)
class Tweet(models.Model):
    user = models.ForeignKey("User", related_name="tweet")
    favorite = models.IntegerField(default=0)
    is_active = models.BooleanField(default=False)

    objects = TweetQuerySet.as_manager()


class TweetQuerySet(models.QuerySet):
    def buzzed(self):
        return self.filter(
            is_active=True,
            favorite__gte=100
        )
# I want to count only the tweets returned using the buzzed query.
users = User.objects.annotate(tweet_count=Count("tweet"))

提前致谢。

django
1个回答
0
投票

这与How to filter objects for count annotation in Django?

就像上面的帖子所说的,你可以在 Count 类中使用 filter 参数。

在你的情况下,你可以这样做:

users = User.objects.annotate(tweet_count=Count("tweet", filter=Q(is_active=True) & Q(favorite__gte=100)))

如果你想在

TweetQuerySet
管理器中有这个逻辑,你可以创建一个方法,返回这个确切的代码,就像这样:

def buzzed_tweets_count(self):
    return self.annotate(tweet_count=Count("tweet", filter=Q(is_active=True) & Q(favorite__gte=100)))

然后调用它:

users = User.objects.buzzed_tweets_count()
© www.soinside.com 2019 - 2024. All rights reserved.