Как назначить каждому PointField с широтой и долготой в update () с помощью выражения F? - PullRequest
1 голос
/ 11 апреля 2019

поэтому я пишу миграцию, которая назначит значения широты и долготы для PointField в каждой записи базы данных.

У меня есть одно решение, которое работает, но оно слишком медленное для 10 000 000 записей базы данных.Поэтому я могу обновить каждую запись в цикле for, просто назначив точку lat и long точке, а затем сохранив запись.Но я хотел использовать метод .update () Django, чтобы сделать это намного быстрее.

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()))

Но это не работает вообще.

1 Ответ

0 голосов
/ 15 апреля 2019

Я получил свой ответ. Вот решение. Я использовал SQL для этого

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

Это решение быстрое.

...