假设你有一个带有 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/ https://docs.djangoproject.com/en/2.0/howto/writing-migrations/