Sagen wir, ich habe etwa 1.000.000 Benutzer. Ich möchte herausfinden, in welcher Position sich ein bestimmter Benutzer befindet und welche Benutzer sich um ihn herum befinden. Ein Benutzer kann jederzeit einen neuen Erfolg erzielen, und wenn er sein stehendes Update sehen könnte, wäre das wunderbar.Django: Wie man eine Bestenliste erstellt
Ehrlich gesagt, jede Art, die ich denke, dies zu tun wäre schrecklich teuer in Zeit und/oder Speicher. Ideen? Meine bisher beste Idee ist es, die Benutzer offline zu ordern und Perzentil-Buckets zu erstellen, aber das kann einem Benutzer nicht seine genaue Position zeigen.
Einige Code, wenn Sie, dass Menschen django hilft:
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)
jemand bitte bearbeiten Sie dies, um mehr artikulieren, ich gehe ins Bett. –
Ich habe versucht, den Benutzern ein Ziel zu geben, indem ich ihnen die Leute über ihnen zeigen wollte, aber nicht zu weit, um unerreichbar zu sein. –
der Jitter in Richtung der Unterseite der Verteilung wird so groß sein, dass sogar auf oder ab gehen 1 Punkt Sie fallen lassen oder gewinnen Sie mehrere tausend Plätze aus 1M. Sie sollten messen, wie Ihre Score-Verteilung aussieht. –