Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中计算用户排名的最佳方法是什么_Python_Django_Sorting - Fatal编程技术网

Python 在Django中计算用户排名的最佳方法是什么

Python 在Django中计算用户排名的最佳方法是什么,python,django,sorting,Python,Django,Sorting,我有一个用django写的网站。该网站有用户谁有点和排名根据他们的点 class Profile(UserenaBaseProfile): points = models.IntegerField(default=100) rank = models.PositiveIntegerField(...) 当一个用户获得一个积分时,他/她的排名将会改变,其他用户也会改变。 问题是什么是计算用户排名的最佳方法,我应该何时计算,或者多久计算一次 谢谢。可能不是每次单个用户的分数增加时更

我有一个用django写的网站。该网站有用户谁有点和排名根据他们的点

class Profile(UserenaBaseProfile):
    points = models.IntegerField(default=100)
    rank = models.PositiveIntegerField(...)
当一个用户获得一个积分时,他/她的排名将会改变,其他用户也会改变。 问题是什么是计算用户排名的最佳方法,我应该何时计算,或者多久计算一次


谢谢。

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

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

假设您的用户列表是这样的(1111etc是usersid):

用户={
1111:{'username':'iskorum',
“点数”:99999
},
2222:{'username':'sidarcy',
“点数”:9444
},
3333:{'username':'joeblogs',
分数:37分
}
}

在实际获取用户排名时,您只需在存储的字典中找到用户的位置

假设用户id为1111

userrank=[i+1表示枚举中的i,x(已排序(用户)),如果x==1111]

返回1

不需要额外的数据库查询

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

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

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

此链接可能会有所帮助,而且这里的Django排名算法也不错,但当我们缓存此词典时(我从“缓存”中了解到,它只是一个变量,不使用DB?这是错的吗?),缓存需要在所有用户上运行,这很简单吗?我建议对这样的东西有一个单独的模型,字典可以放在一个叫做“等级”的字段中。如果cachedRanks:return cachedRanks else:cachedRanks=get from MODEL cache.core.cache import cache cachedRanks=cache.get(“user_list_by_points”),则可以使用cache.get、cache.set来记住从django.core.cache数据库返回的对象(“user_list_by_points”,cachedRanks,10*60)返回cachedRanksIs
user\u list\u by\u points
dictionary或queryset。如果是字典,我将如何创建它?我的意思是创建字典并不费力。如果是queryset,它的优势是什么。对不起,我对缓存了解不多。我知道:)谢谢:)但现在我无法获得排序部分。当有成千上万的用户时,每次对字典进行排序都很容易?Python应该能够处理它,唯一担心的是内存,但是缓存也是您的朋友,您应该在db中缓存已排序的列表。甚至可能在短时间内缓存用户排名。您还可以研究Python中的其他排序方法,看看哪种方法最适合大型列表对象。