我遇到了一个有趣的问题,我知道必须有一个简单的解决方案,但我不知所措。我有一个模型,其字段“priority_score”每天都在变化。我想预测哪个模型在接下来的两周内的任何一天都会有最高优先级。
WEEK = 'WE'
MONTH = 'MO'
QUARTER = 'QU'
TIME_PERIOD_CHOICES = (
(WEEK, 'Week'),
(MONTH, 'Month'),
(QUARTER, 'Quarter'),
)
class Exercise(models.Model):
priority_score = models.DecimalField(max_digits=5, decimal_places=3, editable=False, default = 0)
frequency = models.IntegerField()
time_period = models.CharField(max_length=2, choices=TIME_PERIOD_CHOICES,default=WEEK)
还有一些其他因素影响任何给定对象的priority_score将如何变化。我将跳过这个细节,但总的来说,我会迭代14次(在接下来的两周内每天一次),以确定最高优先级得分是什么。
time_period = {
"WE" : 7,
"MO" : 30,
"QU" : 90,
}
days_to_forecast = 14
recommendations = []
exercise_list = Exercise.objects.all()
for i in range(0, days_to_forecast-1):
queryset = sorted(
chain(exercise_list),
key=attrgetter('priority_score'),
reverse=True)
recommendations.append(queryset)
print i
print queryset[0]
print queryset[0].priority_score
print ""
queryset[0].priority_score = 0
for obj in queryset:
priority_iteration = Decimal(float(obj.frequency) / time_period[obj.time_period])
obj.priority_score = obj.priority_score + priority_iteration
print语句的输出是每个日期具有最高priority_score的对象的精确反映,以及该日期该对象的priority_score。
我想要做的是每天存储排序后的结果并在模板中显示。在每次迭代中,我将新的查询集存储在推荐列表中。但是当我显示推荐的最终输出时,它会显示每个对象的最新“结果”(优先级分数),而不是两周内特定迭代的优先级分数。
我相信正在发生的事情是建议只存储对象的引用,而不是值本身。因此,当我获取建议的结果时,它将解析查询并仅显示每个对象的最终结果,而不是在我将查询集附加到推荐列表时的结果。
如何将循环的每次迭代结果存储到一个对象中,然后可以在整个循环结束时被引用?
更新 我已将问题分离到此部分:
queryset = sorted(
chain(exercise_list),
key=attrgetter('priority_score'),
reverse=True)
似乎如果我只是说queryset = exercise_list,我就不会有这个问题了。但不知何故,使用sorted(),我的建议的输出随着querset值的改变而改变
答案 0 :(得分:0)
我不确定sorted()的技术方面,但我相信这个函数不返回实际对象,而是返回对象的引用。因此,当进行任何更新时,它们将被追溯到原始源(在本例中为原始exercise_list)。因此,当django将变量解析为值时,基于原始exercise_list的任何变量都会自动更新。
要保留变量声明时的当前值,必须制作副本
import copy
queryset = sorted(
chain(exercise_list),
key=attrgetter('priority_score'),
reverse=True)
newobj = copy.deepcopy(queryset)
recommendations.append(newobj)
更改查询集值时,存储在建议中的这些值不会更新。