python - 用户排名 - Django

标签 python django

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

模型.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()

最佳答案

按帖子数对用户进行排序

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

from django.db.models import Count

User.objects.annotate(nposts=Count('post')).order_by('-nposts')

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

用户分配一个数字等级

我们还可以为每个用户分配一个数字等级(因此 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')

数字排名映射到文本排名

我们可以通过定义例如 @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"

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

关于python - 用户排名 - Django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50822307/

相关文章:

python - 改进 Python SKLearn 交叉验证输出

python - Django 。通过关闭钩子(Hook)上的模型访问数据库

django - 在 docker 容器中运行覆盖测试

python - 将numpy图像转换为PIL图像会产生奇怪的结果

database - Django:使用平均达到指定数字的随机整数字段值创建模型实例

python - Cython: fatal error : 'numpy/arrayobject.h' 文件未找到,使用 numpy

python - 在 Windows 操作系统上通过 Waitress 猎鹰

python - 如何使用 Python Selenium 拖放文件?

python - 以较少手动的方式编辑和运行一系列脚本 [Python]

Django "login() takes exactly 1 argument (2 given)"错误