如何从Django中删除模型?

27

在Django中,如何删除已经同步到数据库中的模型?

例如,在Django教程页面上有以下代码:

from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length=200)
    votes = models.IntegerField()

接下来我使用了 python manage.py sql pollspython manage.py sql choice 命令将表格创建到数据库中。但是如果我做错了什么并不想要这个模型了,应该怎样删除它?


1
对于来到这里的人:在当代版本的Django(>1.7)中,当您进行迁移并运行它们时,这将自动处理。从文档中可以看到:“Django可以为您创建迁移。对模型进行更改-例如添加字段和删除模型-然后运行makemigrations:...”。还请参阅链接的问题。 - djvg
11个回答

30

如果您不想删除并重新同步当前数据库,最好的方法是手动从模型中删除表:

$ python manage.py dbshell

> (Inside the DB shell)
> DROP TABLE {app-name}_{model-name};

5
现在,manage.py migrate 提示原始表已不存在。 - EddyTheB

21

为什么不尝试直接从您的models.py文件中删除模型呢?当您运行

python manage.py makemigrations

时,迁移文件应该会更新已删除的模型。


谢谢。这确保了按顺序删除具有外键的多个表。 - Maruthi
2
在执行 python manage.py makemigrations 后,接着执行 python manage.py migrate 以将该模型从数据库中移除。 - Rick Graves

18

没有语法。Django不会删除表或列。您必须手动更改数据库或使用像South这样的迁移工具。

如果您只是在尝试教程,则更简单的方法是删除sqlite数据库文件并再次运行同步。


4
尝试运行命令:django-admin.py flush。 - Cesar Canassa
作为当前版本1.11的更新,python manage.py migrate yourapp zero将撤销您的迁移。 - joe
1
@Sarit 我认为“零”一直存在,至少我在 Django 1.7 中找到了相关参考。但无论如何,由于 syncdb 命令已被弃用并从 Django 中移除,因此这个问题不再有意义。 - Cesar Canassa

4
最简单的解决方法就是从models.py文件中删除你的模型,并运行。
python3 manage.py makemigrations

(注意:从导入了该模型的任何地方(如admin.py、views.py或任何其他导入了它的文件)中删除该模型)
请从所有导入了该模型的地方进行删除。

3

将定义模型的类注释掉对我有用。一旦我这样做并运行python manage.py makemigrations,我得到以下响应:- 删除模型MyModel。之后使用DB浏览器进行检查,发现它确实被删除了。


1

如果你在更新数据库时遇到问题,那么你可以直接运行这个命令。

python manage.py migrate --run-syncdb

1
我通过纯粹的试验找到了一个更简单的方法。即使删除了表格,Django也没有进行迁移,所以我按照以下步骤操作:
只需删除在myapp->migrations目录中创建的文件,确保不要删除init.py和pycache。
1. 从001initial.py开始向下删除文件。 2. 运行python manage.py makemigrations 3. 运行python manage.py migrate -M

1
请勿在生产环境中执行此操作。上述指令仅适用于实验性的 DEV 沙盒。 - Milind Thombre

0
无论您是删除单个模型还是整个应用程序,您都应首先从models.py文件中删除所需的模型。
此外,您必须确保没有其他文件导入这些模型或使用它们(admin.py,views.py等)。
接下来,运行South或迁移数据库以正确删除这些模型。
请在下面的链接上查看此信息的来源:

http://www.marinamele.com/how-to-correctly-remove-a-model-or-app-in-django


0

Django通过syncdb处理数据库时仅仅是增量添加:任何新模型都将被添加,但已删除的模型不会被删除,修改过的模型也不会被修改。

如果您没有要保留的任何数据,则可以轻松地删除和重新创建数据库。但如果您有任何想要保留的数据,即使是计划中的,我强烈建议您使用迁移工具South一直是我所参与的每个项目的事实标准。


0

由于迁移命令处理模型(数据库),您可以执行以下步骤。

首先键入

python manage.py makemigrations app_name#它将重新构造您的模型

然后键入

python manage.py migrate app_name#它将应用于重构您的数据库。

示例: 我有帖子和PostDetail模型, 后来,我想从帖子模型中删除PostDetail模型和一些字段(列)。

我只需运行迁移和迁移命令,在Mysql数据库中检查即可。 它工作得很好。

希望对您也有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接