如何使用 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
提示符?
在我的特殊情况下是这样的:
- 重命名模型 class 名称及其所有引用。
- 运行
./manage.py makemigrations
.
- 检查您的数据库以获取来自您的应用程序的 table 的引用。普通引用和references via
django_content_type
table。相应地处理它们。
检查您的数据库以获取来自 Django tables 的引用。最有可能是:
my_table-+-django_admin_log
`-auth_permission-+-auth_group_permissions
`-auth_user_user_permissions
就我而言,我在 django_admin_log
、auth_group_permissions
、auth_user_user_permissions
中没有记录。
运行./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中没有引用foo
table记录的记录才能回答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
。
假设我有这个模型:
class Foo(models.Model):
name = models.CharField(max_length=255)
我想将其重命名为 Bar
。我应该采取什么步骤?我该如何处理 The following content types are stale
提示符?
在我的特殊情况下是这样的:
- 重命名模型 class 名称及其所有引用。
- 运行
./manage.py makemigrations
. - 检查您的数据库以获取来自您的应用程序的 table 的引用。普通引用和references via
django_content_type
table。相应地处理它们。 检查您的数据库以获取来自 Django tables 的引用。最有可能是:
my_table-+-django_admin_log `-auth_permission-+-auth_group_permissions `-auth_user_user_permissions
就我而言,我在
django_admin_log
、auth_group_permissions
、auth_user_user_permissions
中没有记录。运行
./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中没有引用
foo
table记录的记录才能回答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
。