存储对象的值而不是对对象本身的引用

时间:2015-11-16 00:06:29

标签: python django

我遇到了一个有趣的问题,我知道必须有一个简单的解决方案,但我不知所措。我有一个模型,其字段“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值的改变而改变

1 个答案:

答案 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)

更改查询集值时,存储在建议中的这些值不会更新。