删除 ManyToManyField 时 Django 迁移失败

Django migration fails when removing ManyToManyField

在实时网络应用程序中,我有以下模型(删节):

class Ad(models.Model):
    name = models.CharField(max_length=50)
    apps = models.ManyToManyField(App, null=True, blank=True)

class App(models.Model):
    name = models.CharField(max_length=50)

我有以下 tables(在我的暂存环境中):

sqlite> .tables
auth_group
auth_group_permissions
auth_permission
auth_user
auth_user_groups
auth_user_user_permissions
django_admin_log
django_content_type
django_flatpage
django_flatpage_sites
django_migrations
django_session
django_site
myapp_app
myapp_ad

我不再希望 AdApp 存在多对多关系,因此我从 Ad 中删除了 apps

那么,我运行:

env/bin/python manage.py makemigrations

它产生了这个迁移:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models, migrations


class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0035_auto_20150818_1302'),
    ]

    operations = [
        migrations.RemoveField(
            model_name='ad',
            name='apps',
        ),
    ]

然后,我运行:

env/bin/python manage.py migrate

迁移失败并出现以下错误:

django.db.utils.OperationalError: no such table: myapp_ad_apps

我想这是因为我在第一次使用 ManyToMany 字段时为我创建的多对多 table 幕后操作出了问题。我怎样才能改变我的迁移以使其成功?

对我的问题的评论让我想到了两个解决方案。

来自 GwynBleidD 评论的解决方案

为了在我的暂存环境的 SQLite 数据库上获得 shell,我 运行:

env/bin/python manage.py dbshell

为了在我的暂存环境中列出 table,我 运行:

sqlite> .tables

我注意到 Django 迁移所抱怨的 table myapp_ad_apps 确实丢失了。

还在数据库里shell,我运行:

sqlite> CREATE TABLE myapp_ad_apps(
    ... ID INT PRIMARY KEY     NOT NULL,
    ... );

然后,我重新运行迁移,它成功了(并删除了我刚刚创建的table)。

来自knbk评论的解决方案:

为了运行迁移是假的,我运行:

env/bin/python manage.py migrate --fake

这也解决了问题,独立于第一个解决方案。