【问题标题】:How to make the 'return' from a django model conditional to the value of a global variable?如何使 django 模型的“返回”以全局变量的值为条件?
【发布时间】:2021-05-09 06:28:18
【问题描述】:

我是 Python 和 Django 的新手,我正在努力寻找以全局变量的值为条件从 Django 模型“返回”的方法。

更具体地说,我正在设计一个应用程序来对用户/访问者进行采访。在采访中,向用户提出的问题可以是过去时或现在时。这取决于我从用户那里获得选择的介绍视图,即“过去”或“现在”。

我的模特是

class Question(models.Model):
    key = models.CharField(max_length=50)
    value = models.CharField(max_length=50)
    question_text_past = models.CharField(max_length=2000)
    question_text_now = models.CharField(max_length=2000)
    def __str__(self):
        global TENSE
        if TENSE == 'past':
            return self.question_text_past
        else:
            return self.question_text_now

但是,无论我尝试了什么(在 shell 中测试代码时),我的模型都没有反映 TENSE 值的变化。模型返回“未定义”错误。我还尝试将 TENSE 放入模块 globals.py 并将其导入到我的 models.py 中,但没有成功。我可能遗漏了一些关于 Django 的简单但基本的东西,所以我很感激任何帮助。

【问题讨论】:

  • 不要使用全局变量,全局状态是最严重的反模式之一:它使测试和扩展应用程序变得非常困难,并使视图变得不可预测.
  • Willem 指出,不建议使用全局变量。最好在 settings.py 中定义一个变量并在需要时使用该变量,或者如果您预见到该变量会动态变化,请考虑 django constance
  • 谢谢。我现在了解使用全局变量的缺点。在我的项目中,我迭代一个视图“采访”以获取用户的响应,该响应决定了视图要呈现的下一个问题。为此,“采访”视图必须以某种方式“记住”上一次迭代中的一些值以及时态变量。全局变量的最佳替代方案是什么?

标签: python django model global


【解决方案1】:

您无法使用模块文件中的全局变量来实现此逻辑。

我建议在逻辑发生位置的Question对象上调用.question_text_past.question_text_past

【讨论】:

    【解决方案2】:

    我发现了三种不同的可能性来消除/替换我的应用程序中的全局变量。在我的应用程序(即与用户进行虚拟采访)中,我在同一个视图上使用相同的模板,但视图中的变量会根据用户的选择/响应改变它们的值。它有点像一个用新参数调用自己的函数,但必须“记住”旧参数是什么。

    首先。我设置了一个包含 Global 类的 classes.py 模块。每个属性都替换了以前的全局变量。然后在views.py中导入这个类。这避免了 Django 将类作为数据库表处理。

    第二。创建与模型相同的类。列表和字典类型定义为 JSONField。这里的初始视图创建了一个新实例,一个带有 id 的数据库记录。然而,这个 id 可能仍然需要在整个采访视图中“全局”访问。一种解决方案是启动 Django Session 并使用 session_key(一个糟糕的字符串)作为新创建记录的 id。另一种选择是通过 Constance 使用“全局”变量在 settings.py 中为其分配自动 id。

    第三。对所有全局变量使用 Constance。但是,在阅读文档后,我的印象是 Constance 并非旨在适应频繁变化的动态变量,使用它来存储复杂的数据类型可能会出现问题,例如列表,字典。但是,这只是一个印象。

    非常感谢您的意见/指导/建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 2015-05-01
      • 2014-04-12
      相关资源
      最近更新 更多