如何使用url请求参数运行django额外查询

时间:2015-09-28 16:01:09

标签: python sql django

我想在数据库(在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函数。

使用常量运行查询工作正常,没有错误。所以我猜测它与我的语法有关,包括请求参数。

由于

1 个答案:

答案 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',])

它就像一个魅力! 希望它可以帮助其他人。再次感谢;)