使用Django ORM,Postgres / PostGIS和Django迁移,如何将现有的longitude
和latitude
浮点字段转换为单个GeoDjango Point字段?
我正在寻找类似Location.objects.update(point=(F('longitude'), F('latitude')))
的内容。
答案 0 :(得分:4)
假设您有一个像
这样的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/
答案 1 :(得分:0)
我想我在https://stackoverflow.com/a/37487182/237091找到了解决方案。仍然会更喜欢不会掉到SQL的解决方案。