首页 > 解决方案 > 按帖子评论排名排序的用户列表

问题描述

我想做一个API End Point,这样用户就可以得到他所在城市的用户列表,按他们的帖子评论排序

我在帖子模型中定义了一个方法来计算总评论(赞成票和反对票),我想象可以通过以下路径实现解决方案,但我groupBy post_owner在帖子中并不完全确定orderBy sum(count_reactions()),但我不知道如何在 django 中做到这一点

后模型

class Post(models.Model):
    title = models.TextField(max_length=255, default='Title')
    post_owner = models.ForeignKey(MyUser, on_delete=models.CASCADE)
    description = models.TextField(max_length=255)
    city = models.ForeignKey(City, related_name='location', on_delete=models.CASCADE)
    longitude = models.CharField(max_length=255)
    image = models.CharField(max_length=255,
                             default='https://www.eltis.org/sites/default/files/styles/web_quality/public/default_images/photo_default_2.png')
    latitude = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

    def count_reactions(self):
        likes_count = Reaction.objects.filter(post=self.id, is_like=True).count()
        dislikes_count = Reaction.objects.filter(post=self.id, is_like=False).count()
        return likes_count - dislikes_count

    def owner(self):
        return self.post_owner

我的用户模型

class MyUser(AbstractUser):
    phone_number = models.BigIntegerField(blank=False, unique=True)
    city = models.ForeignKey(City, related_name='city', on_delete=models.CASCADE)
    address = models.CharField(max_length=255)

    def owner(self):
        return self

反应模型

class Reaction(models.Model):
    reaction_owner = models.ForeignKey(MyUser, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, related_name='reactions', on_delete=models.CASCADE)
    is_like = models.BooleanField(null=False)

    def owner(self):
        return self.reaction_owner

预期的结果是通过他们的帖子评论得到用户的有序列表,但只有同一城市的用户(MyUser模型中的城市字段)

标签: pythondjangodjango-modelsdjango-rest-framework

解决方案


您可以将所有内容放入一个查询中。

根据您Reaction命名查询的位置,查询应如下所示:

# Filter for the city you want
users = MyUser.objects.filter(city=your_city_obj)

# Then doing the calculations
users = users.annotate(rank_point=(Count('post__reactions', filter=Q(post__reactions__is_like=True)) - (Count('post__reactions', filter=Q(post__reactions__is_like=False)))))

# And finaly, order the results
users = users.order_by('-rank_point')

推荐阅读