如何使用 Django 重命名模型?

How do I rename a model with Django?

假设我有这个模型:

class Foo(models.Model):
    name = models.CharField(max_length=255)

我想将其重命名为 Bar。我应该采取什么步骤?我该如何处理 The following content types are stale 提示符?

在我的特殊情况下是这样的:

  1. 重命名模型 class 名称及其所有引用。
  2. 运行 ./manage.py makemigrations.
  3. 检查您的数据库以获取来自您的应用程序的 table 的引用。普通引用和references via django_content_type table。相应地处理它们。
  4. 检查您的数据库以获取来自 Django tables 的引用。最有可能是:

    my_table-+-django_admin_log
             `-auth_permission-+-auth_group_permissions
                               `-auth_user_user_permissions
    

    就我而言,我在 django_admin_logauth_group_permissionsauth_user_user_permissions 中没有记录。

  5. 运行./manage.py migrate。当它询问时:

    The following content types are stale and need to be deleted:                
    
        myapp | foo
    
    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?              
    If you're unsure, answer 'no'.                                                  
    
        Type 'yes' to continue, or 'no' to cancel:
    

    只有在上述三个table中没有引用footable记录的记录才能回答yes。或者,如果失去它们对您来说不是问题。

旁注:

在某些情况下,当您更改模型的名称然后 运行 python manage.py makemigrations 时,您会看到自动生成的迁移正在添加新模型,然后删除旧模型(字段为字段,然后是模型本身)。

如果发生这种情况,那么当您尝试 运行 python manage.py migrate:

时可能会遇到此错误
django.db.utils.IntegrityError: (1451, 'Cannot delete or update a parent row: a foreign key constraint fails')

要解决此问题:打开自动生成的迁移文件并手动编辑它,如下所示:

operations = [
        migrations.RenameModel('Foo', 'Bar'),
    ]

然后 运行 再次 python manage.py migrate