【发布时间】:2015-12-25 22:39:13
【问题描述】:
我想在数据库(在 django 中)上运行一个查询,该查询按接近度或“远度”对对象进行排序。该视图使用self.request.query_params.get('latitude', None) 和self.request.query_params.get('longitude', None) 获取用户的经度和纬度。我运行一个选择查询,使用获取的变量进行计算。
谷歌搜索后,我想出了以下使用queryset.extra的视图函数
class FuelStationByLocation(generics.ListAPIView):
serializer_class = FuelStationSerializer
def get_queryset(self):
queryset = FuelStation.objects.all()
latit = self.request.query_params.get('latitude', None)
longit = self.request.query_params.get('longitude', None)
if latit is None:
return queryset
ordered_queryset = queryset.extra(select = {'farness': 'select ((latitude-%f) * (latitude-%f)) + ((longitude-%f) * (longitude-%f))'
%(float(latit), float(latit), float(longit), float(longit)),}, order_by = ['farness',])
return ordered_queryset
但运行后,我得到一个ProgrammingError syntax error at end of input
LINE 1: ...latitude" FROM "fuelmate_fuelstation" ORDER BY "farness" ASC
知道这个错误的根源是什么吗?或者,我们将很高兴有更好的方法来实现这样的功能。
已编辑以包含整个基于类的视图。我正在使用 Django Rest Framework 并覆盖 get_queryset 函数。
使用常量运行查询工作正常,没有错误。所以我猜这与我包含请求参数的语法有关。
谢谢
【问题讨论】:
-
这就是全部代码吗?我觉得还有更多
-
嗨,刚刚添加了一个编辑以显示包含该函数的类。我已经在计算中尝试了使用常量的查询,它没有给出任何错误
-
我不确定是什么问题,但您始终可以使用
print ordered_queryset.query检查您的extra语句生成的原始查询字符串是什么,也许复制原始结果并在您的dbshell. -
@ShangWang 好主意会尝试并发布结果
-
为什么不使用 GeoDjango 进行空间查询? docs.djangoproject.com/en/1.8/ref/contrib/gis