使用 Django ORM、Postgres/PostGIS 和 Django 迁移,如何将现有的 longitudelatitude 浮点字段转换为单个 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 点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48293366/

10-16 17:53