Disons que j'ai environ 1 000 000 utilisateurs. Je veux savoir quelle est la position d'un utilisateur et quels utilisateurs l'entourent. Un utilisateur peut obtenir une nouvelle réalisation à tout moment, et s'il pouvait voir sa mise à jour permanente, ce serait merveilleux. Honnêtement, chaque fois que je pense à faire cela serait horriblement cher dans le temps et/ou de la mémoire. Des idées? Mon idée la plus proche jusqu'ici est de commander les utilisateurs hors ligne et de construire des compartiments de centiles, mais cela ne peut pas montrer à un utilisateur sa position exacte.Django: Comment créer un leaderboard
Une partie du code si cela vous aide django personnes:
class Alias(models.Model) :
awards = models.ManyToManyField('Award', through='Achiever')
@property
def points(self) :
p = cache.get('alias_points_' + str(self.id))
if p is not None : return p
points = 0
for a in self.achiever_set.all() :
points += a.award.points * a.count
cache.set('alias_points_' + str(self.id), points, 60 * 60) # 1 hour
return points
class Award(MyBaseModel):
owner_points = models.IntegerField(help_text="A non-normalized point value. Very subjective but try to be consistent. Should be proporional. 2x points = 2x effort (or skill)")
true_points = models.FloatField(help_text="The true value of this award. Recalculated with a cron job. Based on number of people who won it", editable=False, null=True)
@property
def points(self) :
if self.true_points :
# blend true_points into real points over 30 days
age = datetime.now() - self.created
blend_days = 30
if age > timedelta(days=blend_days) :
age = timedelta(days=blend_days)
num_days = 1.0 * age.days/blend_days
r = self.true_points * num_days + self.owner_points * (1 - num_days)
return int(r * 10)/10.0
else :
return self.owner_points
class Achiever(MyBaseModel):
award = models.ForeignKey(Award)
alias = models.ForeignKey(Alias)
count = models.IntegerField(default=1)
quelqu'un s'il vous plaît modifier cela pour être plus articulé, je vais au lit. –
J'essayais de donner un but aux utilisateurs en leur montrant des personnes au-dessus d'eux pour les battre, mais pas trop loin pour être inaccessible. –
la gigue vers le bas de la distribution sera si grande que même en montant ou descendant 1 point vous laissera tomber ou vous gagnerez plusieurs milliers de places sur 1M. vous devriez mesurer à quoi ressemble votre distribution de score. –