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

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

所以我正在编写迁移,它将为数据库的每条记录中的 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);"
            )

这个解决方案很快。

关于python - 如何使用 F 表达式在 update() 中为每个 PointField 分配纬度和经度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55628419/

相关文章:

python - Pyspark:Pad Array[Int] 列带零

python - 也给组设置属性?

python - 将 `app.add_route()` 用于 GraphQL 时,如何在 FastAPI 中获取用户身份验证信息?

python - view.py 中的问题 : message error Invalid literal for int() with base 10

python-3.x - Pandas:升级后无法加载 Pickle 文件(0.22 到 0.23):

python - 在 spacy 中进行多类分类时出错

python - 如何在 Django 1.6 中使用 HTTP POST 请求接收 json 数据?

python - django tinymce 不显示富文本区域

python - kivy 进口出了什么问题?

python - 在python中使用多个进程记录到一个文件