在Django模型中,将CharField更改为ArrayField

在不更改原数据的情况下,将某一个字符串字段转为列表字段

数据库: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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值