繁体   English   中英

如何在 django rest-api 中获得最喜欢的用户

[英]How to get the most liked users in django rest-api

所以我有一个社交媒体应用程序,用户可以在其中喜欢其他用户的帖子。 现在我想获取点赞数最多的前 20 个用户。 我很困惑如何查询我的赞 Model

我喜欢 MODEL

class PostLike(models.Model):
    user_who_liked = models.ForeignKey(User, on_delete=models.CASCADE)
    post_liked = models.ForeignKey(Post, on_delete=models.CASCADE)
    liked_on = models.DateTimeField(default=timezone.now)

简化后 MODEL

class Post(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    caption = models.TextField()
    date = models.DateTimeField(default=timezone.now)
    likes = models.ManyToManyField(
        User, blank=True, through=PostLike)
    image = models.TextField()

    class Meta:
        ordering = ['-id']

简化用户 MODEL

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    user_name = models.CharField(max_length=100, unique=True)
    date = models.DateTimeField(default=timezone.now)
    profile_picture = models.TextField(
        default="https://www.kindpng.com/picc/m/24-248253_user-profile-default-image-png-clipart-png-download.png")
    bio = models.CharField(max_length=200, default="")
    objects = CustomManger()

    def __str__(self):
        return self.user_name

** 我的观点 **

@api_view(["GET"])
@permission_classes([IsAuthenticated])
def leaderboard(request):
    # I dont know how to query the PostLike model now to get the most liked users
    pass

首先,我在您的Post related_name中更改了user属性,我添加了相关名称,否则相关名称会发生冲突。 这是我使用的定义,否则您的模型将保持不变。

user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author')

即用户的帖子可以通过author属性在User上访问。

以下查询为您提供了按收到的点赞数排名前 20 位的用户:

User.objects.annotate(num_likes=Count('author__likes')).order_by('-num_likes')[:20]

解释:

  • 查询User model 和
  • 通过计数来注释每个用户:
    • author导致用户的帖子
    • likes跟随PostLike并计算与用户发布的帖子相关联的所有喜欢
  • 然后按喜欢的数量降序排列,
  • 并将检索到的对象的数量限制为 20。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM