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



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

我有一个有效的解决方案,但对于 10 000 000 条数据库记录来说太慢了。因此,我可以通过简单地将纬度和长度分配给一个点然后保存一条记录来更新 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()))

但这根本行不通。

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

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

此解决方案速度很快。

最新更新