首页 > 解决方案 > Django 启动代码(如初始缓存)冲突 makemigrations。操作错误没有这样的列表

问题描述

首先,我不喜欢“以 django 方式做”的事情。在开发应用程序时,我更喜欢利用我的基本编程知识,而不是花费数小时学习 django 方式。背景 :


    class Text(models.Model):
        language = models.CharField()
        key = models.CharField()
        text = models.CharField()


    cached_languages = models.Text.objects.all()


    class Text(models.Model):
        language = models.CharField()
        key = models.CharField()
        text = models.CharField()
        **dummy = models.CharField()**

cached_languages = models.Text.objects.all()

我们得到一个错误,说 sqlite3.OperationalError: no such column: app_text.dummy

我应该怎么做才能解决这个问题?

标签: pythondjango

解决方案


问题是,即使您调用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 时执行。


推荐阅读