Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从CharField迁移到CharField的PostgreSQL ArrayField_Python_Django_Python 3.x_Django Migrations - Fatal编程技术网

Python 从CharField迁移到CharField的PostgreSQL ArrayField

Python 从CharField迁移到CharField的PostgreSQL ArrayField,python,django,python-3.x,django-migrations,Python,Django,Python 3.x,Django Migrations,我有一个Django型号,带有CharField。我想将其迁移到包含CharField元素的PostgreSQL。看起来这里应该包括,但我具体应该怎么做 原始型号: from django.db import models class TestModel(models.Model): test_field = models.CharField( max_length=128, choices=[("a", "AAA"), ("b", "BBB")],

我有一个Django型号,带有
CharField
。我想将其迁移到包含
CharField
元素的PostgreSQL。看起来这里应该包括,但我具体应该怎么做

原始型号:

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
    )
…在任何情况下,
测试字段
在原始模型中是空字符串”,成为新模型和数据库字段中的空列表,
[]

在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
,这并不奇怪。

您应该在第一次迁移中同时拥有这两个字段,然后在数据迁移(RunPython)中根据CharField的值填充ArrayField,然后删除CharField(第三次迁移)然后重命名ArrayField(第四次迁移)。您已经完全说服我在@dirkgroten中寻找其他选项。您应该在第一次迁移中同时拥有这两个字段,然后在数据迁移(RunPython)中根据CharField的值填充ArrayField,然后删除CharField(第三次迁移),然后重命名ArrayField(第四次迁移).好吧,你完全说服了我去寻找其他的选择@dirkgroten