Python/Django сортировка набора запросов по расстоянию в REST-фреймворке
В настоящее время я добавляю поле 'distance' в кверисет после его создания, а затем возвращаю его. Однако я хотел бы отсортировать кверисет по расстоянию, если это возможно аннотировать.
В настоящее время моя модель, GeoCache, имеет поля latitude и longitude как models.DecimalField(max_digits=15, decimal_places=10, null=True, blank=True). Используя geopy, я могу добавить расстояние в свой набор запросов следующим образом:
user_location = (self.request.GET.get('latitude') , self.request.GET.get('longitude'))
geocache_list = GeoCache.objects.all()
for geocache in geocache_list:
geocache.distance = geodesic(user_location, (geocache.latitude, geocache.longitude)).miles
return geocache_list
Однако я хотел бы отсортировать набор запросов по расстоянию, от наименьшего к наибольшему. Однако, когда я пытаюсь аннотировать поиск следующим образом:
geocache_list = GeoCache.objects.all().annotate(distance=geodesic(user_location, ('latitude', 'longitude')).miles)
Я получаю ошибку, "ValueError: could not convert string to float: 'latitude'"
Есть ли лучший способ аннотировать это так, чтобы я мог сортировать по расстоянию внутри набора запросов?
Благодаря комментарию Andre Borie, я решил сосредоточиться на сортировке кверисета постфактум, и исправил это следующим образом:
geocache_list_by_distance = sorted(geocache_list, key=operator.attrgetter('distance'))
return geocache_list_by_distance