Python 如何在模型中保存计算结果,而无需对每个调用重新计算?
实际上,我得到了一个模型,具有以下功能:Python 如何在模型中保存计算结果,而无需对每个调用重新计算?,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,实际上,我得到了一个模型,具有以下功能: def speed_score(self): high_intensity_running_time = ((self.h_i_run_time * 100/self.training_length) * 8) if self.h_i_average_speed < 15: average_speed_score = 10 else: average_speed_score = self.cross_multiplica
def speed_score(self):
high_intensity_running_time = ((self.h_i_run_time * 100/self.training_length) * 8)
if self.h_i_average_speed < 15:
average_speed_score = 10
else:
average_speed_score = self.cross_multiplication(30, self.h_i_average_speed, 50)
final_speed_score = int(high_intensity_running_time + average_speed_score)
if final_speed_score < 0 or final_speed_score > 100:
final_speed_score = 0
return final_speed_score
def stamina_score(self):
if self.distance < 1000:
distance_score = 5
else:
distance_score = self.cross_multiplication(16, (self.distance / 1000), 40)
high_intensity_running_duration = self.cross_multiplication(500, self.h_i_run_time, 30)
print self.pace
if self.pace < 0.10:
pace_score = 5
else:
pace_score = self.cross_multiplication(0.36, self.pace, 30)
print pace_score
final_stamina_score = int(distance_score + high_intensity_running_duration + pace_score)
if final_stamina_score < 0 or final_stamina_score > 100:
final_stamina_score = 0
return final_stamina_score
def activity_score(self):
if self.running_time_ratio <= 0.10:
running_time_ratio_score = 10
else:
running_time_ratio_score = self.cross_multiplication(50, self.running_time_ratio, 50)
run_per_min = self.run_number / (self.training_length/60)
if run_per_min < 1:
run_number_ratio = 5
else:
run_number_ratio = self.cross_multiplication(5, run_per_min, 50)
final_activity_score = int(running_time_ratio_score + run_number_ratio)
if final_activity_score < 0 or final_activity_score > 100:
final_activity_score = 0
return final_activity_score
但事实是,每次我调用这些函数时,它都会运行它们并使它们进行计算。这不是我需要的行为,因为计算必须只在第一次调用中完成
我想将它们存储在models.IntegerField中
我怎样才能正确地做到这一点?我在DRF的文档中没有发现这种用法的任何例子
一般来说,我对Django和python完全陌生。你有一个例子来说明这一点吗
让我们先把这些保存到数据库中
我不知道你想把分数存储在哪里,但我们假设它在FieldPlayer
class FieldPlayer(models.Model):
speed_score = models.IntegerField() # or FloatField() etc
another_score = ...
def save_scores(self):
self.speed_score = calculate_speed_score(...)
self.another_score = calculate_another_score(...)
self.save()
现在所有分数都发生了变化,您的游戏逻辑需要通过调用FieldPlayer.save_scores()
在序列化程序中使用这些字段
然后,在序列化程序中,与其他常规字段一样,只需从数据库中再次读取这些字段,而不是计算这些字段
将分数缓存在内存中以提高性能
为了提高性能,从数据库中读取这些值后,可以将它们存储在缓存中。只要记住在分数更新时更新缓存(例如,当您调用PlayerField.save_scores()
)
这样,您就不会每次请求都访问数据库。点击数据库只是为了更新分数并读取一次,直到再次更改为止。不要让我们做腿部工作。在问题中输入相关代码。没有“相关代码”。我想问的是如何将函数结果永久存储在模型中。如果代码不相关,为什么链接会出现在您的问题中?如果您花两分钟的时间仔细阅读我的pastebin和我的帖子,您可能会注意到我发布这篇文章是为了向您展示我只想做一次的所有“*_score”函数,而不是每次我使用这个模型时都重新计算。把代码放在这里,而不是放在一个粘贴箱中。这似乎正是我想要的。但是我不知道我必须在哪里调用FieldPlayer.save_scores(),一定是我不明白的东西吗?你需要在游戏逻辑中的每一个操作之后调用它,这些操作可能会改变玩家的分数。例如,在基于回合的游戏中,将在每个回合完成后进行。根据比赛情况,重要的是当比赛中发生了一些事情,您希望更新分数时,更新DB中的分数。事实上,FieldPlayer代表了一个运动环节。分数只计算一次,永远不会改变。
class FieldPlayer(models.Model):
speed_score = models.IntegerField() # or FloatField() etc
another_score = ...
def save_scores(self):
self.speed_score = calculate_speed_score(...)
self.another_score = calculate_another_score(...)
self.save()