Cho phép nói rằng tôi có khoảng 1.000.000 người dùng. Tôi muốn tìm hiểu vị trí của bất kỳ người dùng cụ thể nào và người dùng nào ở xung quanh anh ta. Người dùng có thể có được thành tích mới bất cứ lúc nào và nếu anh ta có thể thấy cập nhật thường trực của mình, điều đó sẽ tuyệt vời.Django: Cách tạo bảng xếp hạng
Thành thật mà nói, mọi cách tôi nghĩ về việc này sẽ tốn kém khủng khiếp về thời gian và/hoặc trí nhớ. Ý tưởng? Ý tưởng gần nhất của tôi cho đến nay là đặt hàng người dùng ngoại tuyến và tạo nhóm phần trăm, nhưng điều đó không thể hiển thị cho người dùng vị trí chính xác của người dùng.
Một số mã nếu giúp bạn django người:
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)
một người nào đó vui lòng chỉnh sửa nội dung này để phù hợp hơn, tôi sẽ đi ngủ. –
Tôi đã cố gắng cung cấp cho người dùng một mục tiêu bằng cách hiển thị cho họ những người ở trên họ để đánh bại, nhưng không quá xa để không thể truy cập được. –
jitter về phía dưới cùng của phân phối sẽ tuyệt vời đến mức thậm chí lên hoặc xuống 1 điểm sẽ thả bạn hoặc thu được cho bạn vài nghìn địa điểm trong 1 triệu. bạn nên đo lường phân phối điểm của bạn trông như thế nào. –