Django 从字符字段迁移到整数字段?



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

改变方式:

  1. 通过丢失数据(简单方法(

将迁移还原到以前的版本

  1. 而不会丢失数据(更难的方式(

打开 Python shell 或编写脚本 -- 将"email_type"的每个值转换为数字(如 0、1、2、3...(

然后

  • Python manage.py 迁移

最新更新