Django查询返回用户发表帖子的百分比

xkftehaa  于 2022-12-05  发布在  Go
关注(0)|答案(2)|浏览(116)

两种模式用户(内置)和帖子:

class Post(models.Model):
    post_date = models.DateTimeField(default=timezone.now)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='user_post')
    post = models.CharField(max_length=100)

我希望有一个API端点,它可以返回发帖用户的百分比。
我一直在尝试使用注解和聚合,但是我得到的是每个用户的帖子总数,或者每个帖子的用户总数(这是一个......)。我如何才能得到唯一用户返回的帖子总数,除以user.count并返回?
我觉得我错过了一些愚蠢的东西,但我的大脑已经去mush盯着这个。

class PostParticipationAPIView(generics.ListAPIView):
    queryset = Post.objects.all()
    serializer_class = PostSerializer
            
    def get_queryset(self):
        start_date = self.request.query_params.get('start_date')
        end_date = self.request.query_params.get('end_date')
        # How can I take something like this, divide it by User.objects.all().count() * 100, and assign it to something to return as the queryset?
        queryset = Post.objects.filter(post_date__gte=start_date, post_date__lte=end_date).distinct('user').count()         
        return queryset

我的目标是以这样的终点结束:
{参与总数:九十七点三分)
谢谢你的指导。
BCBB公司

yvfmudvl

yvfmudvl1#

像这样东西应该有用

# get total user count
total_users = User.objects.count()
# get unique set of users with post
total_users_who_posted = Post.objects.filter(...).distinct("user").count()
# calculate_percentage
percentage = { 
    "total_participation": (total_users_who_posted*100)/ total_users
}
# take caution of divion by zero
kknvjkwl

kknvjkwl2#

我不认为使用djangos表单可以完全做到这一点,但是你可以使用表单来获得用户计数(包括帖子数和总数):

from django.db.models import BooleanField, Case, Count, When, Value

counts = (User
          .objects
          .annotate(posted=Case(When(user_post__isnull=False,
                                     then=Value(True)),
                                default=Value(False), 
                                output_field=BooleanField()))
          .values('posted')
          .aggregate(posted_users=Count('pk', filter=Q(posted=True)),
                     total_users=Count('pk', filter=Q(posted__isnull=False)))

# This will result in a dict containing the following:
# counts = {'posted_users': ...,
#           'total_users': ....}

相关问题