在我的项目中,我在"settings.py"中做了一些设置字段。文件可通过环境文件向用户公开来配置。因此,用户可以修改.env文件上的值,然后使用它来更新主项目settings.py文件中的设置字段。我想通过将其中一些值迁移到数据库来改进这一点,这样用户就可以通过产品的UI交互式地设置它们的值,而不必修改.env。我采取了以下方法:
- 在DATABASES字典中声明默认数据库之后,我将实例化一个
connection.cursor()
以运行从数据库检索设置的原始SQL查询,如文档中所述。 - 我操作游标的结果来构造一个字典,其中键是设置标识符,值是来自数据库的相关值,由用户设置。
- 这个字典然后被用来给每个Django设置变量分配合适的值(例如
SESSION_COOKIE_AGE
,MEDIA_ROOT
等)。因此,对于每个设置变量,而不是执行getenv
,我使用相关键从字典中检索值。
我观察了settings.py中的代码行为,我可以看到每个设置值都被分配给正确的变量,这与使用之前的.env方法时的情况相同。问题是,当通过django.conf.settings
或直接导入(from project.settings import SETTING
)在代码中访问这些设置变量时,它们的值是一个空字符串,就好像它一开始没有被声明一样。
我注意到在光标实例化之前声明的设置(不管它们的值是硬编码的还是从.env中检索的)工作得很好。在Settings .py文件之外,光标之后的设置似乎不能保持它们的状态。
谁能告诉我为什么在settings.py中使用游标会使之后声明的所有设置字段无效?
我设法解决了这个问题。问题是我使用Django的connection
模型(from django.db import connection
),它在默认数据库上执行SQL查询。因为这是在settings.py中运行的,而项目还在它的设置过程中,它导致了上面描述的奇怪行为。
解决方案:不是使用django.db.connection
(Django模型)来执行查询,而是使用Python的pyodbc
库,这是项目中使用的数据库引擎。使用pyodbc
,我能够建立一个连接到数据库,并运行我的查询(如这里所述),而不管Django的状态。