Python Django是否从字符字段迁移到整数字段?

Python Django是否从字符字段迁移到整数字段?,python,django,migration,Python,Django,Migration,我在模型中更改了一个CharField。py:: models.CharField(max_length=128, blank=True) 进入整数域--> 我有该字段的数据,主要是空字符串(“”)或整数作为字符串(例如:“10”) 所以我想在迁移时将这些字符串转换为整数。如:: 如果空白字符串(”)转换为0,则转换为整数 在执行/manage.py migrate命令时,如何实现这一点 以下是使用/manage.py makemigrations创建的迁移文件: # Generated by

我在模型中更改了一个CharField。py::

models.CharField(max_length=128, blank=True)
进入整数域-->

我有该字段的数据,主要是空字符串(
“”
)或整数作为字符串(例如:
“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

字符/旧:

email_type = models.CharField(max_length=50, default=None)
将其更改为Int/New:

email_type = models.IntegerField(default=None)
  • python manage.py makemigration
改变的方式:

  • 丢失数据(简单方法)
  • 迁移到以前的版本

  • 不丢失数据(更困难的方式)
  • 打开pythonshell或编写脚本——将“email_type”的每个值更改为数字(如0、1、2、3…)

    然后

    • python manage.py迁移

    对于遇到此问题的其他人,您可以添加一个要在其他迁移操作之前运行的函数:

    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
        ]
    

    有关编辑数据迁移的信息,请参阅。

    您已将一个my CharField更改为IntegerField。哪一个?迁移文件显示您更改了3个字段。@RedCricket我将3个charfields更改为integerfield。我通过将数据库中的所有
    空字符串更新为
    0
    解决了这个问题。现在,
    /manage.py migrate
    命令工作正常。您的意思是将所有空值更新为字符串“0”?@RedCricket是。更新后,我运行了有效的
    /manage.py migrate
    。我将首先创建3个新字段并编写一个,然后运行第二次迁移,重新命名这3个字段。将每个模型简化为一个查询:
    aclpowpermissions.objects.filter(ordering='')。更新(ordering=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
        ]