如何将 Django 中的 Char 字段迁移到 Integer 字段?
如何将 Django 中的 Char 字段迁移到 Integer 字段?
我在models.py中更改了一个CharField:
models.CharField(max_length=128, blank=True)
更改为IntegerField,如下:
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
。
admin 更改状态以发布 2023年5月23日
对于其他人来说,您可以添加一个在其他迁移操作之前运行的函数:
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。