通过Django orm获取排名前x%的对象集

通过Django orm获取排名前x%的对象集,django,django-orm,Django,Django Orm,问题是关于Django中的注释和聚合 例如,我有以下模型 class Example(models.Model) rating = models.PositiveSmallIntegerField(min=1, max=10, null=True, blank=True) 其中评级为1到10之间的正整数 目标是从数据库中获取查询集,该数据库将根据它们的评级包含前X%的条目(例如前20%),并在一个查询集中完成,而不使用原始sql(仅由Django ORM使用) 数据库-Postgre

问题是关于Django中的注释和聚合

例如,我有以下模型

class Example(models.Model)
    rating = models.PositiveSmallIntegerField(min=1, max=10, null=True, blank=True)

其中评级为1到10之间的正整数

目标是从数据库中获取查询集,该数据库将根据它们的评级包含前X%的条目(例如前20%),并在一个查询集中完成,而不使用原始sql(仅由Django ORM使用)

数据库-Postgres

数据集可能不包含1到10之间的所有值。例如,它可能是6,7,3,3,3,4,5

我所做的:

from django.db.models import FloatField, Max, Min
from django.db.models.functions import Ceil, Floor

def top_x_percent(self, percent: int) -> models.QuerySet:
    """
    Returns top x % of according their rating.
    """
    result = self.aggregate(
        Min('rating', output_field=FloatField()),
        Max('rating', output_field=FloatField()),
    )
    one_percent_value = (result['rating__max'] - result['rating__min']) / 100
    top_range = (
        Ceil(result['rating__max'] - (percent * one_percent_value)),
        Floor(result['rating__max'])
    )
    return self.filter(rating__range=top_range)
但它有两个查询集

有没有办法在一个单一整洁的queryset中实现这一切


谢谢你

我想你目前的代码并没有真正显示统计意义上的前20%,即百分位。计算百分位数需要考虑整个数据,这可以通过使用cronjobs并将它们存储在表或用户模型中来实现,这样您就不必每次都计算它们。我想您当前的代码并没有真正显示统计意义上的前20%,即百分位数。计算百分位数需要考虑整个数据,这可以通过使用cronjobs并将它们存储在表或用户模型中来实现,这样您就不必每次都计算它们。