sqlite Django 4:如何将MultiPolygonField从可空修改为非空

voase2hg  于 2023-03-08  发布在  SQLite
关注(0)|答案(1)|浏览(139)

我正在尝试转换我的MultiPolygonField字段:

multipolygon = MultiPolygonField(null=True)

改为:

multipolygon = MultiPolygonField(null=False)

它看起来很简单,所以我执行"makemigrations",并得到一条常见的消息警告,指出数据库需要填充现有行(我确认数据库中没有该字段为空的行):
我是否选择选项1:
1.立即提供一次性默认值(将在此列具有空值的所有现有行上设置)
并将以下设置为默认值:

'SRID=3857;POINT(0.0 0.0)'

或备选案文2:
1.暂时忽略。必须手动处理包含NULL值的现有行,例如使用RunPython或RunSQL操作
当我执行"migrate"时,我收到以下错误:
ValueError:无法将字段borders. border. multipolygon更改为borders. border. multipolygon-它们没有正确定义db_type(您使用的是编写错误的自定义字段吗?)
我已经能够对其他更简单的字段类型做同样的修改,没有任何问题。如何对多多边形字段做这件事?我正在使用Django 4和sqlite 3. 31,以防万一。

slsn1g29

slsn1g291#

这就是我最终“解决”这个问题的方法(虽然没有完全解决,但我找到了一个更长的方法来获得相同的结果):
我将迁移分为6个步骤:
1.我创建了新字段“multipolygon_new”
1.我将数据从初始字段“multipolygon”复制到我刚刚创建的新字段“multipolygon_new”
1.我删除了初始字段“多面”
1.我再次创建了“多面”,但不为空
1.我将数据从“multipolygon_new”复制到“multipolygon”
1.我删除了“多面_新建”
对于步骤2和5,使用以下命令创建自定义迁移:

python manage.py makemigrations --empty yourappname

然后我修改了迁移文件以执行我的自定义拷贝查询:

migrations.RunSQL(
    sql=[("UPDATE mytable ......", ],
)

对于其他步骤,我使用了常用的makemigrations命令。

相关问题