从Django 1.7+中删除模型时要做的事情

Xia*_*ang 20 django

我想知道当我们想要从Django中删除模型时,是否有任何人可以提供完整的事情列表.我知道有人提出了类似的问题.但似乎是几年前人们还在使用南方来处理数据库.所以我希望得到最近版本的Django的答案.

我总结一下我所知道的内容如下:

  1. 从model.py中删除模型的代码
  2. 确保没有其他文件导入此模型或使用它们(admin.py,views.py等)
  3. 运行makemigrations迁移命令
  4. 由于Django不会为您清理数据库,因此您可以从数据库中手动删除此模型的表
  5. 另请注意,有一个名为ContentTypes的表,可以记录每个模型的信息.所以你需要手动删除这个模型的记录(但我不知道该怎么做.请问有人解释一下吗?)

这些都是我所知道的.有什么不对的吗?我忘了什么吗?也许我过于谨慎,但我想保持数据库清洁.非常感谢!

Dan*_*ins 34

在Django 1.7中,这实际上比你想象的要简单得多.假设您有一个应用程序books,有两个型号:BookBookReview.您想要删除Book模型.

  1. 删除Book代码中对模型的所有引用.例如,删除模型ForeignKey('books.Book')上的字段BookReview.无需为此更改单独迁移.
  2. Book从中删除模型的代码books/models.py.现在,创建一个migration(manage.py makemigrations).如果查看生成的迁移,则应包含migrations.DeleteModel操作.
  3. 运行自动生成的migration(manage.py migrate),系统会询问您ContentType不再需要的相关对象:

    Running migrations:
      Applying books.0002_auto_20150314_0604... OK
    The following content types are stale and need to be deleted:
    
        books | book
    
    Any objects related to these content types by a foreign key will also
    be deleted. Are you sure you want to delete these content types?
    
    Run Code Online (Sandbox Code Playgroud)

    您可能确实想要删除内容类型.如果您不想被要求输入,您可以使用manage.py migrate --noinput.

    DeleteModel此迁移中的操作将删除books_book数据库中的表,因此您根本不必担心手动清理.

  • 请注意,在同一次迁移中删除外键和模型完全没问题 - Django会在删除模型之前自动检测并重新排序迁移以删除外键.测试用例:https://github.com/django/django/blob/1.7/tests/migrations/test_autodetector.py#L684 (4认同)