首页 > 解决方案 > 向models.py添加了额外的模型,但我得到`OperationalError:没有这样的表`

问题描述

我的 webappwebapp已经在models.py. 让我们称它们为Model1and Model2。它们已构建,它们可以工作,它们都已在我的 webapp 中注册,admin.py并且整个 webapp 正在运行。我可以转到管理控制台 ( /admin) 并查看两个表都在那里,我可以查看它们。

我想添加第三个表,Model3. 我在其中写出了代码models.py——它看起来与其他两个模型非常相似,只是字段略有不同。我修改admin.py以包含它,就像其他两个一样。然后我删除了该migrations文件夹并执行了以下 Django 命令:

$ python manage.py makemigrations webapp
Migrations for 'webapp':
  webapp/migrations/0001_initial.py
    - Create model Model1
    - Create model Model3
    - Create model Model2
$ python manage.py migrate webapp
Operations to perform:
  Apply all migrations: admin, webapp, auth, contenttypes, sessions
Running migrations:
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK

我不确定实际上正在运行的那些迁移是什么(我最近没有改变Model1Model2。当我运行 webapp 并进入管理控制台时,与和Model3一起出现,但单击它会产生以下错误:Model1Model2

Internal Server Error: /admin/webapp/model3/
Traceback (most recent call last):
  File "/.../venv/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/.../venv/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py", line 383, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such table: webapp_model3

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/.../venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/.../lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  ... 
  (24 frames omitted)
  ...
  File "/.../venv/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/.../venv/lib/python3.7/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 table: webapp_model3

当我尝试以编程方式访问模型时,我也会遇到这种类型的错误(从工作正常导入models.py,但实际上访问Model3.objects会触发错误)。

我确定我忘了做某事,但我不知道该做什么

这是使用 Django 提供的开箱即用的默认 sqlite 数据库。我不能完全删除我的数据库 - 由于与此问题无关的原因,必须使用它当前拥有的相同信息重新填充它是很麻烦的。我可以根据需要从最近的备份中恢复,并且在测试解决方案时我一直在这样做。过去,我能够对数据库进行修改,Model1Model2无需删除和重新创建数据库。


生成的内容webapp/migrations/0001_initial.py有:

# Generated by Django 2.2.5 on 2019-11-20 18:55

import webapp.models
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Model1',
            fields=[
                ('key1', models.FloatField(blank=True, primary_key=True, serialize=False)),
                ('key2', models.CharField(default=None, max_length=10)),
                ('key3', models.CharField(default=None, max_length=100)),
                ('key4', models.TextField(blank=True, default=None, null=True)),
                ('key5', models.ImageField(blank=True, default=None, upload_to=webapp.models.func1)),
            ],
        ),
        migrations.CreateModel(
            name='Model3',
            fields=[
                ('NewKey1', models.FloatField(blank=True, primary_key=True, serialize=False)),
                ('NewKey2', models.CharField(default=None, editable=False, max_length=10)),
                ('NewKey3', models.CharField(default=None, editable=False, max_length=100)),
                ('NewKey4', models.TextField(blank=True, default=None, editable=False, null=True)),
                ('NewKey5', models.TextField()),
            ],
        ),
        migrations.CreateModel(
            name='Model2',
            fields=[
                ('KeyA', models.IntegerField(primary_key=True, serialize=False)),
                ('KeyB', models.CharField(default=None, max_length=100)),
                ('KeyC', models.CharField(default=None, max_length=100)),
                ('KeyD', models.CharField(default=None, max_length=100)),
                ('KeyE', models.TextField(blank=True, default=None, null=True)),
                ('KeyF', models.ImageField(default=None, upload_to=webapp.models.func2)),
                ('KeyG', models.ImageField(default=None, upload_to=webapp.models.func3)),
                ('KeyH', models.BooleanField(default=False)),
                ('KeyI', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='webapp.Model1')),
            ],
        ),
    ]

标签: pythondjango

解决方案


Django 使用django_migrations表来跟踪所有已应用的迁移。所以大概0001_initial已经应用了,因此 Django 没有运行它migrate

你需要:

  • 自己创建一个新的迁移文件,例如0001_auto_20191120.py
  • 放文件中的migrations.CreateModelModel30001_initial.py
  • 放置0001_initial为依赖项(放入dependencies迁移文件列表中)
  • python manage.py migrate webapp

推荐阅读