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

时间:2019-04-11 08:54:09

标签: python django python-3.x django-models geodjango

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

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

'employee'

此方法有效,但是要花费太多时间,几乎不可能做到1千万条记录

for x in q:
   if str(x) in str(d.values()):
       print(d.keys()) # this print all the keys of dict.

这是我尝试执行的操作,但出现错误。

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

我也尝试过

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

但这根本不起作用。

1 个答案:

答案 0 :(得分:0)

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

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

此解决方案很快。