一旦在Django中创建了另一个实例,如何才能使从模型类实例派生的变量更改?

时间:2014-03-06 20:13:08

标签: python django session-storage

在我的models.py中,我有一个模型类ExchangeRate,其中最常用的是我用来派生一个名为rate的变量。然后我声明了一个函数,它使用这个变量生成相应的GBP到Euro的值。

我的一个视图使用该函数来更新上下文变量。

这很好用,但是当我创建一个应该成为最新版本的ExchangeRate的新实例时,我发现即使我离开感兴趣的网址也存在前一个值的持久性。我只能在停止并重新启动开发服务器时获取要使用的新值。

当我离开然后返回相关的页面/网址,或者每次刷新浏览器时,如何在创建新的ExchangeRate实例的同时更改汇率?

我怀疑这与我需要的会话存储有关(假设这是问题,不想关闭它)。

更多详情如下:

* models.py

class ExchangeRate(models.Model):
    value = models.DecimalField(max_digits=5, decimal_places=2)
    date = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return str(self.value)

我在课堂下面这样分配了它 -

rate = ExchangeRate.objects.latest('date').value

并在以下函数中使用它 -

def euro_total(amount):
    return int(rate * amount)

* views.py。

输出用于填充以下SessionWizardView

的上下文
class PaymentWizard(SessionWizardView):
    def get_context_data(self, form, **kwargs):
        context = super(PaymentWizard, self).get_context_data(form=form, **kwargs)
        cleaned_data = super(PaymentWizard, self).get_cleaned_data_for_step('amount') or {'method': 'none'}
        payment_choice = cleaned_data.get('payment_choice')
        if cleaned_data.get('amount'):
            amount = int(cleaned_data.get('amount'))
            if self.steps.current == 'confirm_amount' or 'bank' or 'card' and not None:
                updates =({'input_amount': amount},
                {'payment_choice': payment_choice},           
                {'GBP_total': gbp_total(amount, payment_choice)},
                {'EURO_total': euro_total(amount)},
                )
            for update in updates:
                context.update(update)
    return context

谢谢大家。

2 个答案:

答案 0 :(得分:0)

所以,你的最终评论揭示了这个问题。在首次导入模块时,将在全局级别定义任何内容,并且在重新启动服务器进程之前不会更改。

您需要将该行移动到每次执行的位置:例如,在euro_total函数内。

或者,如果你担心每次都要点击数据库,你可以使用类似memcache的东西,短暂的超时,并让你的功能在从数据库加载之前先检查缓存。

或者,您可以向ExchangeRate添加一个保存后信号,当一个新值添加到数据库时,它会显式设置全局rate变量。

答案 1 :(得分:0)

如果rate需要是全局级别的项目(也许你将它用作缓存值?)那么就像@Daniel所说的那样,你可以使用保存后信号在新的时候自动刷新它保存ExchangeRate对象。

参见django.db.models.signals.post_savehow to use signals

在Django文档中