5

假设我有这个模型:

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

我想将其重命名为Bar. 我应该采取哪些步骤?以及如何处理The following content types are stale提示?

4

2 回答 2

3

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

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

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

    django_admin_log就我而言,我在, auth_group_permissions,中没有记录auth_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:
    

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

于 2017-08-12T15:41:15.190 回答
2

边注:

在某些情况下,当您更改模型的名称然后运行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再次运行。

于 2018-10-15T20:42:31.650 回答