gpt4 book ai didi

django - 从经度/纬度迁移到 GeoDjango Points?

转载 作者:行者123 更新时间:2023-12-02 07:25:42 29 4
gpt4 key购买 nike

使用 Django ORM、Postgres/PostGIS 和 Django 迁移,如何将现有的经度纬度浮点字段转换为单个 GeoDjango Point 字段?

我正在寻找类似 Location.objects.update(point=(F('longitude'), F('latitude'))) 的内容。

最佳答案

假设你有一个带有 PointField 的对象

from django.contrib.gis.db import models

class Location(models.Model):
longitude = models.FloatField()
latitude = models.FloatField()
point = models.PointField(geography=True, default='POINT(0.0 0.0)') #or similar

你可以这样做:

from django.contrib.gis.geos import Point

for l in Location.objects.all():
l.point = Point(x=l.longitude, y=l.latitude, srid=4326)
l.save()

或者如果您确实想要单个更新(尽管未经测试),则此单个语句应该有效:

Location.objects.all().update(point=Point(x=F('longitude'), y=F('latitude'), srid=4326))

注意:虽然我经常使用 GeoDjango 和 postgis,但我绝不是这方面的专家。我不知道 PointField 在幕后做什么...如果它创建了一个关系,那么它将无法在单个语句中工作,因为 Django 不允许在更新语句中跨表更新,您必须循环,如果它只是格式化数据然后它应该可以正常工作...我做了一些研究,似乎 srid 是唯一的关系,所以这应该没问题,因为在更新语句中创建静态关系很好。

根据您上面发布的答案,您只需将其编写为迁移文件中的函数(例如名为 set_points),然后将其添加到迁移的操作部分中即可运行它:

migrations.RunPython(set_points),

迁移编写引用:

https://docs.djangoproject.com/en/2.0/howto/writing-migrations/

关于django - 从经度/纬度迁移到 GeoDjango Points?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48293366/

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