如何使用F表达式在update()中为每个PointField分配纬度和经度?

问题描述 投票:1回答:1

所以我正在编写迁移,它将在每个数据库记录中为PointField分配纬度和经度值。

我有一个解决方案可行,但对于10 000 000个数据库记录而言太慢了。所以我可以通过简单地将lat和long分配给一个点然后保存记录来更新for循环中的每个记录。但我想使用Django的.update()方法来更快地完成这项工作。

class Listing(AirbnbModel):
 latitude = models.DecimalField()
 longitude = models.DecimalField()
 point = PointField(srid=4326, geography=True, null=True) # new field

这可行,但需要花费太多时间,并且几乎不可能为10 000 000条记录执行此操作

for listing in Listing.objects.all():
        listing.point = Point(float(listing.latitude), float(listing.longitude))
        listing.save()

这是我试图做的但我得到了一个错误。


    Listing.objects.all().update(point=ExpressionWrapper(F('latitude'), F('longitude') , output_field=PointField()))

我也尝试过这个

      Listing.objects.all().update(point=ExpressionWrapper(Point(Value('latitude'), Value('longitude')), output_field=PointField()))

但这根本不起作用。

python django python-3.x django-models geodjango
1个回答
0
投票

我得到了答案。这是解决方案。我使用SQL

with connections[self.db_name].cursor() as cursor:
            cursor.execute(
                f"UPDATE listings SET point = ST_MakePoint(latitude, longitude);"
            )

这个解决方案很快。

© www.soinside.com 2019 - 2024. All rights reserved.