【问题标题】:Rank of users - Django用户排名 - Django
【发布时间】:2018-06-12 17:04:29
【问题描述】:

如何根据用户的帖子总数对用户进行排名。 示例第一:帖子总数 1-10 第二:帖子总数11-20 第三:帖子总数21-30

models.py

from django.db import models
User = get_user_model()

class Post(models.Model):
    author = models.ForeignKey(User, on_delete = models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()

    def get_absolute_url(self):
        return reverse("post_detail",kwargs={'pk':self.pk})

    def __str__(self):
        return self.title

    def count_posts_of(user):
        return Post.objects.filter(author=user).count()

【问题讨论】:

    标签: python django


    【解决方案1】:

    Users 按帖子数量排序

    我们可以用Posts 的数量注释User,然后在该注释上使用order_by

    from django.db.models import Count
    
    User.objects.annotate(nposts=Count('post')).order_by('-nposts')
    

    这里的破折号 (-) 表示我们按 降序 顺序排序(因此从许多帖子到少数帖子)。如果您删除破折号,则它按升序顺序排列。

    Users 分配一个数字排名

    我们还可以通过添加一些额外的注释为每个用户分配一个数字排名(因此 1-10 映射到 1,11-20 映射到 2 等):

    from django.db.models import Count, F
    from django.db.models.expressions import Func
    
    User.objects.annotate(
        nposts=Count('post'),
        nrank=Func(F('nposts') / 10, function='CEIL'),
    ).order_by('-nposts')
    

    numeric 排名映射到 textual 排名

    我们可以将此排名映射到文本排名,例如定义@property

    from django.contrib.auth import User
    
    RANK_TEXTS = ['zero', 'first', 'second', 'third']
    
    def rank_text(self):
        nrank = getattr(self, 'nrank', None)
        if nrank is None:
            nrank = (Post.objects(author=self).count() + 9) // 10
        return RANK_TEXTS[nrank]
    
    
    User.rank_text = property(rank_text)
    

    所以我们猴子补丁 User 类使其具有属性rank_text。如果我们用nrank 属性注释User,这将首先查看。如果不是,我们手动计算nrank。最后我们返回文本副本。

    所以我们可以查询:

    u1 = User.objects.first()
    u1.rank_text  # for example "second"
    

    Se here [so-post] 如何猴子修补 Django 模型。

    【讨论】:

    • 但我也需要指定范围
    • @user:但你所说的“范围”是什么意思?您想用 1 到 3 之间的数字(排名)注释每个用户吗?
    • 帖子总数为 1-10 的用户将在名为“第一”的类别中,11-20 在“第二”的类别中,依此类推
    • @user:您如何准确地表示这些类别(常量“first”、“second”等)存储在哪里?
    • 只是标签。我不确定如何存储和分配它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多