我首先通过一个简单的for循环尝试了一个基本的实现,如下所示。它可以工作,但由于有10k条记录,因此需要的时间太长。
panoramas = Panorama.objects.all()
for panorama in panoramas:
panorama.geo_location = Point([panorama.longitude, panorama.latitude])
panorama.save()基于Django的update方法,我尝试了如下所示:
geo_location = Panorama.objects.all().update(
geo_location=fromstr(f'POINT({longitude} {latitude}', srid=4326)
)这不起作用,因为我试图让Django为每条记录挑选经度/经度,并根据这两个字段更新geo_location,但django不知道经度或纬度是什么。
有没有办法使用update()来实现这个功能呢?
发布于 2020-06-10 01:24:28
在update操作中使用数据库中的值正是ORM F-expressions的用途。
在文档中的示例中,
这一点:
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed += 1
reporter.save()可以访问以下地址:
reporter = Reporters.objects.filter(name='Tintin')
reporter.update(stories_filed=F('stories_filed') + 1)好处是拉取stories_filed + 1,并在数据库中运行它的操作(添加)。
PostGIS SQL中的具体示例(未测试):
UPDATE
panorama
SET
geom = ST_SetSRID(
ST_Point(panorama.longitude, panorama.latitude),
4326
)
FROM
panorama
;发布于 2020-06-13 07:34:32
我知道了如何以优化的方式批量更新geom字段。在循环中单独保存每条记录耗时如此之长(正如预测的那样),因此这里需要使用django的bulk_update()方法。Django bulk_update documentation
panoramas = Panorama.objects.all()
for panorama in panoramas:
panorama.geo_location = Point(panorama.longitude, panorama.latitude, srid=4326)
Panorama.objects.bulk_update(panoramas, ['geo_location'])https://stackoverflow.com/questions/62287902
复制相似问题