从CharField迁移到PostgreSQL ArrayField-of-CharField

时间:2019-09-11 18:28:55

标签: python django python-3.x django-migrations

我有一个带有CharField的Django模型。我想将其迁移到包含CharField元素的PostgreSQL ArrayField。看来RunPython应该参与其中,但是我应该具体怎么做?

原始模型:

from django.db import models

class TestModel(models.Model):
    test_field = models.CharField(
        max_length=128,
        choices=[("a", "AAA"), ("b", "BBB")],
        blank=True,
        default="",
    )

数据库表具有根据此模型创建的一些行:

from my_app.models import TestModel
t1 = TestModel.objects.create()  # test_field == ''
t2 = TestModel.objects.create(test_field="a")

现在我想迁移到:

from django.contrib.postgres.fields import ArrayField

class TestModel(models.Model):
    test_field = ArrayField(
        models.CharField(max_length=128, choices=[("a", "AAA"), ("b", "BBB")]),
        default=list,
        blank=True
    )

...在任何情况下,test_field在原始模型中都是空字符串"",成为新模型和数据库字段[]中的空列表。 / p>

在Python空间中,它看起来像:

convert_ftype = lambda val: [val] if val else []

使上面的两个模型实例变为:

t1 = TestModel.objects.create()  # test_field == []
t2 = TestModel.objects.create(test_field=["a"])

仅运行./manage makemigrations && ./manage migrate就会抛出django.db.utils.DataError,这并不奇怪。

0 个答案:

没有答案