首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何批量更新基于经纬度的geom字段?

如何批量更新基于经纬度的geom字段?
EN

Stack Overflow用户
提问于 2020-06-10 00:56:36
回答 2查看 142关注 0票数 0

我首先通过一个简单的for循环尝试了一个基本的实现,如下所示。它可以工作,但由于有10k条记录,因此需要的时间太长。

代码语言:javascript
复制
panoramas = Panorama.objects.all()
for panorama in panoramas:
    panorama.geo_location = Point([panorama.longitude, panorama.latitude])
    panorama.save()

基于Django的update方法,我尝试了如下所示:

代码语言:javascript
复制
geo_location = Panorama.objects.all().update(
    geo_location=fromstr(f'POINT({longitude} {latitude}', srid=4326)
)

这不起作用,因为我试图让Django为每条记录挑选经度/经度,并根据这两个字段更新geo_location,但django不知道经度或纬度是什么。

有没有办法使用update()来实现这个功能呢?

EN

回答 2

Stack Overflow用户

发布于 2020-06-10 01:24:28

在update操作中使用数据库中的值正是ORM F-expressions的用途。

在文档中的示例中,

这一点:

代码语言:javascript
复制
reporter = Reporters.objects.get(name='Tintin')
reporter.stories_filed += 1
reporter.save()

可以访问以下地址:

代码语言:javascript
复制
reporter = Reporters.objects.filter(name='Tintin')
reporter.update(stories_filed=F('stories_filed') + 1)

好处是拉取stories_filed + 1,并在数据库中运行它的操作(添加)。

PostGIS SQL中的具体示例(未测试):

代码语言:javascript
复制
UPDATE
    panorama
SET
    geom = ST_SetSRID(
        ST_Point(panorama.longitude, panorama.latitude),
        4326
    )
FROM
    panorama
;

参考: PostGIS ST_Point,PostgreSQL UPDATE

票数 0
EN

Stack Overflow用户

发布于 2020-06-13 07:34:32

我知道了如何以优化的方式批量更新geom字段。在循环中单独保存每条记录耗时如此之长(正如预测的那样),因此这里需要使用django的bulk_update()方法。Django bulk_update documentation

代码语言:javascript
复制
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'])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62287902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档