Один из способов сделать это - использовать пользовательский запрос для вычисления ранга на лету. Таким образом, вы оставляете расчет ранга в базе данных. Этот урок содержит хорошее объяснение того, как это сделать.
Вот запрос со связанного веб-сайта, модифицированный в соответствии с вашей моделью:
SELECT r1.username, r1.points, COUNT(r2.points) rank
FROM app_rank r1, app_rank r2
WHERE r1.points <= r2.points or (r1.points = r2.points and r1.username = r2.username)
GROUP BY r1.username, r1.points
ORDER BY r1.points DESC, r1.username DESC;
Что касается примечания, вы можете переписать цикл без использования переменной счетчика i
.
for index, user in enumerate(user_list):
user.rank = index + 1
user.save()