Python Django是否从字符字段迁移到整数字段?
我在模型中更改了一个CharField。py::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
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
- 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
]