对于我的基本Django CMS,我尝试添加切换功能来发布/取消发布博客文章(我将我的应用称为“文章”,并且模型内部的类对象为is_published
) ,尝试使用管理仪表板添加论文内容时遇到了OperationalError。我希望能够切换一个复选框以进行发布/取消发布,但是现在我什至无法访问仪表板。
这是我的Django服务器回溯的一部分:
File "/home/<user>/dev/projects/python/2018-and-2020/<projectdir>/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/home/<user>/dev/projects/python/2018-and-2020/<projectdir>/venv/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 383, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such column: essays_essayarticle.is_published
调试回溯加强了上面的OperationalError:
OperationalError at /admin/essays/essayarticle/
no such column: essays_essayarticle.is_published
Request Method: GET
Request URL: http://<DN>.ngrok.io/admin/essays/essayarticle/
Django Version:2.2.11
Exception Type: OperationalError
Exception Value:
no such column: essays_essayarticle.is_published
Exception Location:
/home/<user>/dev/projects/python/2018-and-2020/<projectdir>/venv/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py in execute, line 383
Python Executable:
/home/<user>/dev/projects/python/2018-and-2020/<projectdir>/venv/bin/python
`Fri, 1 May 2020 19:37:31 +0000
异常值表示“无此列”,这是对我的数据库的引用。我正在运行SQlite3进行测试。在执行OperationalError之前,我正在对DummyNode和“ isinstance django.db.migrations.exceptions.NodeNotFoundError:迁移”的问题进行故障排除。我到达的先前解决方案是在两个应用程序中删除迁移。这样的答案是解决问题的特定解决方案:https://stackoverflow.com/a/56195727/6095646
根据 @Laila Buabbas 的建议,为澄清起见,我删除了自己的迁移目录,并为我的两个应用程序分别调用了python manage.py makemigrations app_name
。这样以前的SQLite问题已解决。但是我无法找出上述新的OperationalError。
问题出在我的views.py / models.py(在下面复制)吗?我无法将范围缩小到更具体的范围。这是我的应用程序的models.py中定义的类的一部分(最后添加了新的潜在问题行):
class EssayArticle(models.Model):
title = models.CharField(max_length=256)
web_address = models.CharField(max_length=256)
web_address_slug = models.SlugField(blank=True, max_length=512)
content = models.TextField(blank=True)
is_published = models.BooleanField(default=True)
以下是我views.py中适用功能的相关行:
def article(request, web_address):
try:
article = EssayArticle.objects.get(
web_address_slug=web_address) # .filter(is_published=True)
except EssayArticle.DoesNotExist:
raise Http404('Article does not exist!')
context = {
'article': article,
}
return render(request, 'essays/article.html', context)
注释我们的.filter(is_published=True)
不会停止或更改调试错误。
我的本地开发箱是带有Django v2.2.11的Manjaro Linux。我正在运行Python v3.8.2。
以下是我已经利用的一些资源:
答案 0 :(得分:2)
您数据库的essays_essayarticle表中没有is_published列,尝试通过添加新迁移在db中添加列,并查看表的更改是否要添加此列。
该错误不在您的视图中,而是在查询中。
答案 1 :(得分:1)
看起来您的同名迁移已被触发,这就是Django无法创建新列的原因,
您必须查看数据库中的表django_migrations
,然后删除迁移记录。您需要将迁移与数据库中的django_migrations
进行比较,然后才发现问题/错误
从数据库中的django_migrations
删除迁移后,运行迁移
./manage.py migrate
那么您的问题可能会得到解决
答案 2 :(得分:0)
我假设您已删除了Migrations文件夹,如果这样,在进行迁移和迁移时,请在末尾写下您的应用名称
示例
python manage.py makemigrations app_name