删除ManyToManyField

时间:2015-08-18 20:15:07

标签: python django django-migrations

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

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)

我有以下表格(在我的登台环境中):

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拥有ManyToMany关系,因此我从apps移除了Ad

然后,我跑了:

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字段时为我创建了许多表的幕后错误。如何更改迁移以使其成功?

1 个答案:

答案 0 :(得分:2)

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

来自GwynBleidD评论的解决方案

要在我的登台环境的SQLite数据库上获取shell,我运行了:

env/bin/python manage.py dbshell

要在我的登台环境中列出表格,我跑了:

sqlite> .tables

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

仍在DB shell中,我跑了:

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

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

来自knbk评论的解决方案

为了运行虚假的迁移,我跑了:

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

这也解决了问题,与第一种解决方案无关。