代码之家  ›  专栏  ›  技术社区  ›  Nonso

如何在Django中创建另一个实例后立即更改从模型类实例派生的变量?

  •  0
  • Nonso  · 技术社区  · 12 年前

    在我的models.py中,我有一个模型类ExchangeRate,它是我用来导出一个称为rate的变量的最新模型。然后我声明了一个函数,该函数使用该变量生成英镑对欧元的对应值。

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

    这很好,但当我创建一个新的ExchangeRate实例(该实例应该是最新的)时,我发现即使在我离开感兴趣的url时,仍然存在前一个值的持久性。我只能在停止并重新启动开发服务器时获得要使用的新值。

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

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

    更多详情如下:

    *型号.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 回复  |  直到 12 年前
        1
  •  0
  •   Daniel Roseman    12 年前

    所以,你的最后评论揭示了问题。在全局级别定义的任何内容都将在模块首次导入时执行,直到服务器进程重新启动后才会更改。

    您需要将该行移动到每次执行的某个位置:例如,在 euro_total 作用

    或者,如果您担心每次都会命中数据库,可以使用memcache之类的方法,并使用短暂的超时,然后让函数在从数据库加载之前先检查缓存。

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

        2
  •  0
  •   foz    12 年前

    如果 rate 需要是全局级别的项(也许您正在将其用作缓存值?),然后正如@Daniel所说,每当保存新的ExchangeRate对象时,您可以使用保存后信号自动刷新它。

    看见 django.db.models.signals.post_save how to use signals

    在Django文档中。