如何将 Django 中的 Char 字段迁移到 Integer 字段?

16 浏览
0 Comments

如何将 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日
0
0 Comments

在你的迁移中,将AlterField更改为RemoveField,然后再添加AddField - 注意,这将删除你现有的数据!

    migrations.RemoveField(
        model_name='aclpermissions',
        name='ordering',
    ),
    migrations.AddField(
        model_name='aclpermissions',
        name='ordering',
        field=models.IntegerField(default=0),
    ),

0
0 Comments

对于其他人来说,您可以添加一个在其他迁移操作之前运行的函数:

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

0