在实时网络应用中,我有以下模型(删节):
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
我不再希望Ad
与App
拥有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字段时为我创建了许多表的幕后错误。如何更改迁移以使其成功?
答案 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
这也解决了问题,与第一种解决方案无关。