gpt4 book ai didi

python - Geodjango:使用迁移将现有数据的 PolygonField 更改为 MultiPolygonField

转载 作者:太空宇宙 更新时间:2023-11-03 14:02:19 27 4
gpt4 key购买 nike

我有一个带有PolygonField的模型,其中有几十行。我正在尝试将字段更改为 MultiPolygonField,但数据仍处于 polygon 模式。如何将所有现有数据转换为新类型?

models.py:

class Region(models.Model):
class Meta:
verbose_name = _("region")
verbose_name_plural = _("regions")

polygon = models.PolygonField(_("polygon")) # <== this is going to be MultiPolygon
name = models.CharField(_("name"), max_length=100)

最佳答案

选项 1:使用 SQL

假设您使用的是postgis,以下SQL可以使用ST_Multi转换您的数据:

ALTER TABLE myapp_region
ALTER COLUMN polygon TYPE geometry(MultiPolygon, 4326)
USING ST_Multi(polygon);

不要直接执行此命令,而是运行 makemigrations ,这将创建一个新的迁移(例如:myapp/migrations/0006_yyyyyyyy.py),类似于:

import django.contrib.gis.db.models.fields
from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('myapp', '0005_zzzzzzzzzzzzz'),
]

operations = [
migrations.AlterField(
model_name='region',
name='polygon',
field=django.contrib.gis.db.models.fields.MultiPolygonField(srid=4326),
),
]

使用 RunSQL 操作封装您的 AlterField 操作,如下所示:

operations = [
migrations.RunSQL(
"ALTER TABLE myapp_region ALTER COLUMN polygon type geometry(MultiPolygon, 4326) using ST_Multi(polygon);",
state_operations=[
migrations.AlterField(
model_name='region',
name='polygon',
field=django.contrib.gis.db.models.fields.MultiPolygonField(
srid=4326),
),
],
)
]

现在运行您的迁移。

选项 2:数据迁移

  • 在当前字段旁边创建一个新的 geom = models.MultiPolygonField(null=True) 字段。
  • 创建并运行迁移以添加新的多边形字段。
  • 创建 data migration并使用RunPython复制您的数据:

    for o in Region.objects.all():
    o.geom = MultiPolygon([o.polygon])
    o.save()

    (未经测试:您也许可以使用 Region.objects.update() 代替)

  • models.py中,删除原来的字段并移除null=True;创建迁移。
  • 可选:使用另一个迁移将 geom 重命名为 polygon

关于python - Geodjango:使用迁移将现有数据的 PolygonField 更改为 MultiPolygonField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49153381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com