python - Django 启动代码(如初始缓存)冲突 makemigrations。操作错误没有这样的列表
问题描述
首先,我不喜欢“以 django 方式做”的事情。在开发应用程序时,我更喜欢利用我的基本编程知识,而不是花费数小时学习 django 方式。背景 :
- 我正在开发的应用程序是一个 REST 后端,用于存储语言信息等本地化值。
- 我想获取存储在数据库中的语言信息,并在启动时将其加载到内存中,然后在请求到来时从内存中提供该数据。
- 我创建了我的模型
class Text(models.Model):
language = models.CharField()
key = models.CharField()
text = models.CharField()
- 然后运行 python manage.py makemigrations 并作为常规步骤迁移命令
- 然后我跳过去,实现了我的缓存代码,直接放在admin.py下(可能是urls.py没关系,只需要运行一次)
cached_languages = models.Text.objects.all()
- 我继续运行我的应用程序,它运行良好。
- 然后我想在我的文本模型中添加一个字段,例如
class Text(models.Model):
language = models.CharField()
key = models.CharField()
text = models.CharField()
**dummy = models.CharField()**
- 然后点击 python manage.py makemigrations 命令并在line
cached_languages = models.Text.objects.all()
我们得到一个错误,说 sqlite3.OperationalError: no such column: app_text.dummy
我应该怎么做才能解决这个问题?
解决方案
问题是,即使您调用python manage.py makemigrations ,django 也会执行编写的每一行代码。这意味着在 django 实际反映对数据库的更改之前,它会执行整个项目,当涉及到缓存行时,它会尝试从 Text 表中获取所有行,该表还没有虚拟列,但从 django 的角度来看(在代码中)表 Text 有一个column dummy 这就是它引发错误的原因。
解决方法是在 settings.py 中添加一个标志
IS_RUNNING = False
并在 manage.py 添加以下内容
from app import settings
if 'runserver' in sys.argv:
settings.IS_RUNNING = True
并在标志检查后放置您的缓存代码
if settings.IS_RUNNING:
cached_languages = models.Text.objects.all()
那么django在应用它们之前进行迁移时不会尝试获取记录。缓存算法只会在您实际调用 runserver 时执行。
推荐阅读
- java - 由于 Grails 中的 java.lang.reflect.MalformedParameterizedTypeException,创建名称为“pluginManager”的 bean 时出错
- javascript - 如何使用节点 js 检查“s3”/“azure”路径中是否存在文件
- ios - 如何使用 alamofire 在 iOS swift 中处理空数组响应
- sql-server - SQL Server AlwaysOn 可用性组/镜像 RPO 和可用性
- sql-server - SQL 实例和等待锁
- python - 使用 itertools 创建可能组合的矩阵
- c# - 如何将对象类型的对象转换为列表
- java - 尝试沿 y 轴移动时,任何精灵都会消失
- bayesian - 使用 PyMC3 进行贝叶斯非线性回归
- python - 在列表的指定元素中附加数字