Django 1.11:在网址

时间:2018-06-13 11:00:54

标签: django django-rest-framework django-views django-queryset django-urls

TL; DR:如何在网址中接受浮动作为查询参数?

我用Django Rest Framework编写了一个API视图。 API应该能够使用GET请求按地址坐标列出房屋。这意味着用户应该能够将包含坐标的查询作为get请求发送,并且应该返回这些坐标周围所有房屋的列表。

以下是视图(views.py):

class HouseListAPIView(generics.ListAPIView):
    serializer_class = HouseListSerializer
    queryset = House.objects.all()

    def get_queryset(self):
        qs = self.queryset
        longitude = self.request.query_params.get('lon', None)
        latitude = self.request.query_params.get('lat', None)
        radius = self.request.query_params.get('radius', 1)
        if radius < 0 or radius >= 1:
            radius = 1
        if longitude is not None and latitude is not None:
            qs = qs.filter(
                address__coordinates__latitude__lte=get_lat_max(longitude, latitude, radius),
                address__coordinates__latitude__gte=get_lat_min(longitude, latitude, radius),
                address__coordinates__longitude__lte=get_lon_max(longitude, latitude, radius),
                address__coordinates__longitude__gte=get_lon_min(longitude, latitude, radius)
            )
        return qs

以下是辅助函数(utils.py):

import geopy
from geopy.distance import VincentyDistance


def get_lat_lon_values_from_radius(d, lat1, lon1, b):
    """
    given: lat1, lon1, b = bearing in degrees, d = distance in kilometers
    """
    origin = geopy.Point(lat1, lon1)
    destination = VincentyDistance(kilometers=d).destination(origin, b)

    lat2, lon2 = destination.latitude, destination.longitude
    return lat2, lon2


def get_lat_max(lat1, lon1, d=1):
    # latitude = north / south
    return int(get_lat_lon_values_from_radius(d, lat1, lon1, 0)[0])


def get_lat_min(lat1, lon1, d=1):
    return int(get_lat_lon_values_from_radius(d, lat1, lon1, 180)[0])


def get_lon_max(lat1, lon1, d=1):
    # longitude = west / east
    return int(get_lat_lon_values_from_radius(d, lat1, lon1, 90)[1])


def get_lon_min(lat1, lon1, d=1):
    return int(get_lat_lon_values_from_radius(d, lat1, lon1, 270)[1])

我的问题是我目前得到一个空的查询设置,因为网址中的数字由于某种原因被舍入:

input_lat: 50.7758666, input_lon: 6.0849401
lat_max: 6
lat_min: 6
lon_max: 50
lon_min: 50

如何将经度和纬度作为查询范围中的浮点数传递给视图?

2 个答案:

答案 0 :(得分:2)

当您在视图中访问query_params时,它会为您提供字符串对象。您应该将其转换为float,如下所示:

longitude = float(self.request.query_params.get('lon', None))

答案 1 :(得分:1)

(代表问题作者发布的答案)

使用neverwalkaloner的答案,我这样解决了它:

  def hpssop(self):
        self.file = "file.wav"
        self.y, self.sr = librosa.load(self.file)
        self.margin_harms = self.margin_har.value()
        self.margin_pers = self.margin_per.value()
        self.harmonic, self.percussive = librosa.effects.hpss(self.y,
                                                              margin=(self.margin_harms, self.margin_pers))
        librosa.output.write_wav("harmonic.wav", self.harmonic, self.sr)
        librosa.output.write_wav("percussive.wav", self.percussive, self.sr)

    def onseparateclick(self):
        self.hpss.clicked.connect(self.hpssop)