首页 > 解决方案 > 如何在Django Rest中距离客户位置25公里的基础上列出/订购模型中具有经纬度字段的多家医院?

问题描述

我目前在 DRF 工作,我有一个可以列出的许多医院的数据列表。我需要根据客户所在地的半径25公里来订购。医院模型和客户档案都有纬度和经度字段。

标签: django-rest-framework

解决方案


我认为您正在寻找的方法是GeoDjango,它为您提供空间支持,并允许您定义如下字段:

from django.contrib.gis.db.models import PointField

class Hospital(models.Model):
    coordinates = PointField(
        geography=True,
        null=True,
        blank=True,
    )

并且考虑到您的用户也有一个coordinates字段,您可以执行以下操作distance_lte

from django.contrib.gis.measure import D

hospitals_within_25_km_radius = Hospital.objects.filter(
    coordinates__distance_lte=(user.coordinates, D(km=25))
)

甚至根据最近的医院进行过滤和排序

from django.contrib.gis.db.models.functions import Distance

hospitals_within_25_km_ordered_by_closest = Hospital.objects.annotate(
    distance=Distance('coordinates', user.coordinates),
).filter(
    distance__lte=25000,
).order_by(
    'distance',
)

推荐阅读