Django: how do I sort a class by an expensive-to-calculate property and
make the results persistent?
What is best way to sort model elements by an expensive property value,
and to make sure the property values persist through many request/response
iterations? I might try something like:
class Player(models.Model):
name = models.CharField(max_length=100)
@classmethod
def sorted_by_player_scores(cls, league):
'would be very nice to be able to use a simple query here'
from operator import itemgetter
try:
return sorted(cls.player_score_list, key=itemgetter(1),
reverse=True)
except Attribute Error:
players = cls.objects.all()
for player in players:
player_score_list = []
try:
player_score_list.append((player, player.player_score))
except AttributeError:
league_player = LeaguePlayer(league, player)
player_score_list.append((player,
league_player.player_score))
cls.player_score_list = player_score_list
return sorted(player_score_list, key=itemgetter(1), reverse=True)
class League(models.Model):
name = models.CharField(max_length=100)
league_size = models.IntegerField()
scoring_rules = ...
class LeaguePlayer():
def __init__(self, league, player):
self.league = league
self.player = player
@property # is cached_property usable/useful here?
def player_score(self):
self.player.player_score = very_expensive_calculation()
return self.player.player_score
def many_other_properties_and_methods_against_LeaguePlayers
I feel my problem would be a common django problem, yet I can't find a
simple solution or even some general best-practice discussion. I know I
could make class LeaguePlayer() a django model rather than simply a python
class. But I don't want to have actually create / save these datatables
when the values I would be saving are very easily wrapped by the @property
tag.
No comments:
Post a Comment