在不更改原数据的情况下,将某一个字符串字段转为列表字段
数据库:PG
EG:
class Package(AbstractModel):
category = models.CharField(
choices=CONTENT_CATEGORIES, max_length=20, verbose_name="产品类型", help_text="产品类型")
1、首先添加一个新字段,用来存储原字符字段的值
class Package(AbstractModel):
category = models.CharField(
choices=CONTENT_CATEGORIES, max_length=20, verbose_name="产品类型", help_text="产品类型")
category_list = ArrayField(models.CharField(
choices=CONTENT_CATEGORIES, max_length=20), verbose_name="产品类型列表", help_text="产品类型列表")
2、执行迁移,同步数据库字段
3、创建一个空migrate文件,例如0049.py
# Generated by Django 3.2.11 on 2023-06-19 03:35
import django.contrib.postgres.fields
from django.db import migrations, models
import system_utils.defined_field
import utils.auto_bind_model
def convert_to_array(apps, schema_editor):
Campaign = apps.get_model('test', 'campaign')
db_alias = schema_editor.connection.alias
for instance in Campaign.objects.using(db_alias).all():
# 将原始字符串转换为数组
array_data = [instance.os]
instance.os_list = array_data
instance.save()
class Migration(migrations.Migration):
dependencies = [
('test', '0086_auto_20230619_1135'),
]
operations = [
migrations.RunPython(convert_to_array)
]
4、最后删除原字段,例如:category,将新增字段category_list更名为category
生成migrate文件,可更改字段后,手动创建migrate文件0050.py,如下
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('dsp', '0049'),
]
operations = [
migrations.RemoveField(
model_name='package',
name='category',
),
migrations.RenameField(
model_name='package',
old_name='category_list',
new_name='category',
)
]
执行迁移,CharField更改为ArrayField