我在 models.py 中更改了我的一个CharField::
models.CharField(max_length=128, blank=True)
成整数字段 -->
models.IntegerField(default=0)
我有该字段的数据,主要是空字符串(""
( 或整数作为字符串(例如:"10"
(。
所以我想在迁移时将这些字符串转换为整数。 例如:: 如果空白字符串(""
(转换为0
,否则转换为整数。
当我执行命令时,我如何实现./manage.py migrate
?
以下是使用./manage.py makemigrations
创建的迁移文件 ::
# Generated by Django 2.1.2 on 2018-10-25 04:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('dashboard', '0002_auto_20181024_1544'),
]
operations = [
migrations.AlterField(
model_name='aclpermissions',
name='ordering',
field=models.IntegerField(default=0),
),
migrations.AlterField(
model_name='submenus',
name='ordering',
field=models.IntegerField(default=0),
),
migrations.AlterField(
model_name='subsubmenus',
name='ordering',
field=models.IntegerField(default=0),
),
]
当我运行./manage.py migrate
时,我收到错误::
psycopg2.DataError: invalid input syntax for integer: ""
因为有些字段带有空字符串""
.
所以我想将空字符串(""
(转换为0
。
对于遇到此问题的其他人,您可以在其他迁移操作之前添加一个函数:
class Migration(migrations.Migration):
def blank_to_zero(apps, schema_editor):
AclPermissions = apps.get_model('dashboard', 'AclPermissions')
SubMenus = apps.get_model('dashboard', 'SubMenus')
SubSubMenus = apps.get_model('dashboard', 'SubSubMenus')
for obj in AclPermissions.objects.filter(ordering=''):
obj.ordering = 0
obj.save()
for obj in SubMenus.objects.filter(ordering=''):
obj.ordering = 0
obj.save()
for obj in SubSubMenus.objects.filter(ordering=''):
obj.ordering = 0
obj.save()
dependencies = [
('dashboard', '0002_auto_20181024_1544'),
]
operations = [
migrations.RunPython(blank_to_zero),
migrations.AlterField(...
# the rest of your operations
]
有关编辑数据迁移的信息,请参阅 https://docs.djangoproject.com/en/dev/topics/migrations/#data-migrations。
将AlterField迁移到RemoveField,然后更改AddField ->请注意,这将删除您现有的数据!
migrations.RemoveField(
model_name='aclpermissions',
name='ordering',
),
migrations.AddField(
model_name='aclpermissions',
name='ordering',
field=models.IntegerField(default=0),
),
Char/OLD:
email_type = models.CharField(max_length=50, default=None)
将其更改为 Int/New:
email_type = models.IntegerField(default=None)
- Python manage.py makemigration
改变方式:
- 通过丢失数据(简单方法(
将迁移还原到以前的版本
- 而不会丢失数据(更难的方式(
打开 Python shell 或编写脚本 -- 将"email_type"的每个值转换为数字(如 0、1、2、3...(
然后
- Python manage.py 迁移