【问题标题】:How to run django extra query with url request params如何使用 url 请求参数运行 django 额外查询
【发布时间】: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 语句生成的原始查询字符串是什么,也许复制原始结果并在您的dbshel​​l.
  • @ShangWang 好主意会尝试并发布结果
  • 为什么不使用 GeoDjango 进行空间查询? docs.djangoproject.com/en/1.8/ref/contrib/gis

标签: python sql django


【解决方案1】:

感谢所有乐于助人的 cmets 家伙。最后,@AlexeyKuleshevich 的评论帮助最大。使用各种输入在 shell 中测试查询表明,对于“longit”和“latit”的正输入,所有这些都可以正常工作;该错误仅在我使用负经度或纬度进行测试时才出现。所以我最后只是将我所有的 %fs 括在括号中,以防止任何负面迹象迎面而来,例如,'纬度 - 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',])

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多