Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 存储对象的值,而不是对象本身的引用_Python_Django - Fatal编程技术网

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

Python 存储对象的值,而不是对象本身的引用,python,django,Python,Django,我遇到了一个有趣的问题,我知道它一定有一个简单的解决方案,但我不知所措。我有一个模型,它的“优先级分数”字段每天都在变化。我想预测在未来两周的任何一天,哪种型号的优先级最高 WEEK = 'WE' MONTH = 'MO' QUARTER = 'QU' TIME_PERIOD_CHOICES = ( (WEEK, 'Week'), (MONTH, 'Month'), (QUARTER, 'Quarter'), ) class Exercise(models.Model):

我遇到了一个有趣的问题,我知道它一定有一个简单的解决方案,但我不知所措。我有一个模型,它的“优先级分数”字段每天都在变化。我想预测在未来两周的任何一天,哪种型号的优先级最高

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)
还有一些其他因素会影响任何给定对象的优先级分数的变化。我将跳过这个细节,但一般来说,我将迭代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
打印语句的输出准确反映了每个日期具有最高优先级的对象以及该对象在该日期的优先级

不过我想做的是每天存储排序的结果,并在模板中显示出来。在每次迭代中,我都将新的查询集存储在推荐列表中。但当我显示建议的最终输出时,它显示的是每个对象的最新“结果”(优先级分数),而不是两周内特定迭代的优先级分数

我相信现在的情况是,建议只存储对对象的引用,而不是值本身。因此,当我获取建议的结果时,它将解析查询并仅显示每个对象的最终结果,而不是我将查询集附加到建议列表时的结果

如何将循环每次迭代的结果存储到一个对象中,然后在整个循环结束时引用该对象

更新 我已将问题隔离到本节:

queryset = sorted(
    chain(exercise_list),
    key=attrgetter('priority_score'),
    reverse=True)

如果我只是说queryset=exercise\u list,我就不会有这个问题了。但不知何故,使用sorted(),我的建议的输出会随着查询集值的变化而变化,我不确定sorted()的技术方面,但我相信该函数不会返回实际对象,而是返回对该对象的引用。因此,当进行任何更新时,它们都会追溯到原始源(在本例中,是原始练习列表)。因此,当django将变量解析为值时,基于原始练习列表的任何变量都会自动更新

若要保留变量声明时的当前值,必须创建副本

import copy

queryset = sorted(
    chain(exercise_list),
    key=attrgetter('priority_score'),
    reverse=True)
newobj = copy.deepcopy(queryset)
recommendations.append(newobj)

当queryset值更改时,存储在推荐中的这些值不会更新。

我不确定sorted()的技术方面,但我相信该函数不会返回实际对象,而是返回对该对象的引用。因此,当进行任何更新时,它们都会追溯到原始源(在本例中,是原始练习列表)。因此,当django将变量解析为值时,基于原始练习列表的任何变量都会自动更新

若要保留变量声明时的当前值,必须创建副本

import copy

queryset = sorted(
    chain(exercise_list),
    key=attrgetter('priority_score'),
    reverse=True)
newobj = copy.deepcopy(queryset)
recommendations.append(newobj)

当queryset值更改时,存储在建议中的这些值将不会更新。

在进入迭代之前将
execute\u list
转换为列表应该可以工作,对吧?也许可以。我试试看。问题是。转换为列表是否仍允许我访问附加到原始对象的其他属性?例如,在我的循环中,我还附加了辅助对象,每个辅助对象都有自己的优先级分数。这意味着我可以获得查询集[0]的结果。优先级分数以及查询集[0]。训练[0]。优先级分数。转换成列表会让我得到第二个值吗?我想你还是应该得到对象。通过将查询转换为列表,我们所做的唯一更改是在进入循环之前执行/评估查询集。因此,下一个问题,如何将查询转换为列表?exerce\u list=list(exerce.objects.all())。不过还是要提醒一下。如果表很大,这是一种非常缓慢的方法。在进入迭代之前将
execute\u list
转换为列表应该可以,对吧?也许可以。我试试看。问题是。转换为列表是否仍允许我访问附加到原始对象的其他属性?例如,在我的循环中,我还附加了辅助对象,每个辅助对象都有自己的优先级分数。这意味着我可以获得查询集[0]的结果。优先级分数以及查询集[0]。训练[0]。优先级分数。转换成列表会让我得到第二个值吗?我想你还是应该得到对象。通过将查询转换为列表,我们所做的唯一更改是在进入循环之前执行/评估查询集。因此,下一个问题,如何将查询转换为列表?exerce\u list=list(exerce.objects.all())。不过还是要提醒一下。如果桌子很大,这是一种非常缓慢的方式。