Вот как я бы это сделал. Добавьте столбцы 'total' и 'points' к вашей модели, например так:
class UserTrophy(models.Model):
...
total = models.IntegerField()
points = models.IntegerField()
...
Переопределить метод сохранения для вашей модели:
def save(self, *args, **kwargs):
# Compute the total and points before saving
self.total = self.platinum + self.gold + self.silver + self.bronze
self.points = self.platinum * 100 + self.gold * 50 + \
self.silver * 25 + self.bronze * 10
# Now save the object by calling the super class
super(UserTrophy, self).save(*args, **kwargs)
Имея общее количество очков и баллов в качестве первоклассных граждан в вашей модели, ваша концепция «ранга» становится просто вопросом упорядочения и нарезки объектов UserTrophy.
top_ten = UserTrophy.objects.order_by('-points')[:10]
Вы также должны убедиться, что ваши поля проиндексированы, чтобы ваши запросы были эффективными.
Если вам не нравится идея размещения этих полей в вашей модели, вы можете использовать функцию extra объектов набора запросов Django для вычисления вашего итогового значения и баллов на лету. Я использую это не очень часто, так что, может быть, кто-то другой может привести пример.
Кроме того, я рекомендую вам прочитать PEP 8 для соглашений Python по кодированию.