我想在数据库(在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函数。
使用常量运行查询工作正常,没有错误。所以我猜测它与我的语法有关,包括请求参数。
由于
答案 0 :(得分:0)
感谢所有有用的评论家伙。最后@AlexeyKuleshevich的评论帮助最大。使用各种输入在shell中测试查询表明,对于“longit”和“latit”,所有正常输入都正常工作;当我用负经度或纬度测试时,错误只显示出来。因此,我最后将所有%fs括在括号中,以防止任何负面符号出现,例如,'latitude - 60.1001'将变为'纬度 - ( - 60.1001)'。 我最终得到了以下查询:
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',])
它就像一个魅力! 希望它可以帮助其他人。再次感谢;)