我在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
。
答案 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)
更改方式:
Revert迁移到以前的版本
打开Python shell或编写脚本以-将'email_type'的每个值更改为数字(例如0、1、2、3 ...)
然后