djangoORM怎么获取数据在数据集中的排名?

我有一个数据表

class Currency(models.Model):
    agent = models.OneToOneField('users.Agent', on_delete=models.CASCADE)
    consume_total = models.DecimalField(max_digits=10, decimal_places=2, help_text='个人销售额')
    class Meta:
        ordering = ['-consume_total']

我需要在视图里返回 用户的排名,排名是根据consume_total 这个字段的值进行排。

1,获取当前登录用户排在第几名

2,获取排名的前10名

3,获取当前用户排名的前5名和他之后的5名
这种应该怎么写?

class MyRank(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = request.user
        res_data = {}
        count = Currency.objects.count()
        res_data['people_count'] = count  # 总人数
        #  获取当前用户排在第几名
        
        #  获取排名前10名
        
        #  获取当前用户排名的前5名和他之后的5名
        
        return Response(data=res_data)
阅读 2.7k
1 个回答

假设consume_total不重复

获取当前用户排在第几名

# 先获取当前用户的销售额
consume = Currency.objects.get(agent=user).consume_total
# 筛选出所有高于此销售额的数据,取一下count就是当前用户的排名
rank = Currency.objects.filter(consume_total__gt=consume).count()

排名的前十名

# 按照consume_total 降序排序 然后取前10个
Currency.objects.order_by('-consume_total').values_list('agent', flat=True)[:10]

获取当前用户排名的前5名和之后的5名

# 当前用户排名的前5名
consume = Currency.objects.get(agent=user).consume_total
Currency.objects.filter(consume_total__gt=consume).order_by('consume_total')[:5]
# 当前用户排名的后5名
Currency.objects.filter(consume_total__lt=consume).order_by('-consume_total')[:5]

如果有重复的 就看你怎么处理重复销售额的排名了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题