我有一个带有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
,这并不奇怪。