【问题标题】:What is the best way to calculate rank of users in Django在 Django 中计算用户排名的最佳方法是什么
【发布时间】:2012-11-09 09:55:58
【问题描述】:

我有一个用 django 编写的网站。网站的用户有积分,并根据他们的积分排名。

class Profile(UserenaBaseProfile):
    points = models.IntegerField(default=100)
    rank = models.PositiveIntegerField(...)

当用户获得积分时,他/她的排名将会改变,其他用户也会改变。 问题是计算用户排名的最佳方法是什么,我应该何时计算或多久计算一次?

谢谢。

【问题讨论】:

标签: python django sorting


【解决方案1】:

每次单个用户的积分增加时更新每个用户的排名可能不是最好的方法。如果你有很多用户,这对后端来说会很苛刻。

如果您想在个人资料页面上显示用户排名,也许您可​​以有一个查询来获取按点排序的所有用户的列表,将其单独存储为字典或其他任何内容并大量缓存它。这对性能会更好。

假设您的用户列表看起来像这样(1111 等是用户 ID):

USERS = { 1111: {'username': 'iskorum', 'points':99999 }, 2222: {'username': 'sidarcy', 'points':9444 }, 3333: {'username': 'joeblogs', 'points':37 } }

在实际获得用户排名时,您可以简单地在这个存储的字典中找到用户的位置。

假设用户 ID 是 1111

userrank = [i+1 for i,x in enumerate(sorted(USERS)) if x == 1111]

返回 1

不需要额外的数据库查询

如果它只是一个小站点,每次获取用户列表并找到当前用户在该列表中的位置没有害处。

但是,如果您期望有成千上万的用户,上述方法可能是更好的方法。

编辑:您还应该缓存排序列表,如下面的 cmets 中所述 每次对列表进行排序可能会占用大量内存

【讨论】:

  • 看起来不错,但是当我们缓存这个字典时(我从“缓存”中理解只是一个变量,不使用数据库?这是错误的吗?)并且缓存需要在所有用户上运行,这很容易?
  • id 推荐的是为这样的东西有一个单独的模型,字典可以放在一个名为“ranks”的字段中。您可以使用 cache.get、cache.set 来记住从数据库中返回的对象 from django.core.cache import cache cachedRanks = cache.get("user_list_by_points") if cachedRanks : return cachedRanks else: cachedRanks = GET FROM MODEL cache。 get("user_list_by_points", cachedRanks, 10*60) return cachedRanks
  • user_list_by_points 字典或查询集。如果它是字典,我将如何创建它?我的意思是创建字典并不费力。如果是查询集有什么好处。抱歉,我不太了解缓存。
  • 我明白了 :) 谢谢 :) 但现在我无法得到排序部分。有上万用户,每次对字典进行排序都很容易?
  • Python 应该能够处理它,唯一担心的是内存,但这里的缓存也是您的朋友,您应该将排序列表缓存在数据库中。甚至可能在短时间内缓存用户排名。您还可以研究 Python 中的替代排序方法,看看哪种方法最适合大型列表对象。
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
相关资源
最近更新 更多