所以我正在编写迁移,它将在每个数据库记录中为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()))
但这根本不起作用。
我得到了答案。这是解决方案。我使用SQL
with connections[self.db_name].cursor() as cursor:
cursor.execute(
f"UPDATE listings SET point = ST_MakePoint(latitude, longitude);"
)
这个解决方案很快。