Django是否从Char字段迁移到Integer字段?

时间:2018-10-26 04:15:23

标签: python django migration

我在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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-1)

字符/旧:

email_type = models.CharField(max_length=50, default=None)

将其更改为Int / New:

email_type = models.IntegerField(default=None)
  • python manage.py makemigration

更改方式:

  1. 通过丢失数据(轻松方式)

Revert迁移到以前的版本

  1. 不丢失数据(更危险的方式)

打开Python shell或编写脚本以-将'email_type'的每个值更改为数字(例如0、1、2、3 ...)

然后

  • python manage.py migration