3

假设我有一个照片模型。在照片模型中,我的照片模型中有经度和纬度字段。

 class Photo(models.Model):
      photographer = models.ForeignKey(Photographer, related_name = 'shot_owner')
      title = models.CharField(max_length=140, blank=True)
      description = models.CharField(max_length, blank=True)
      longitude = models.DecimalField(max_digits=16, decimal_places = 14, null=True, blank=True)
      latitude = models.DecimalField(max_digits=16, decimal_places = 14, null=True, blank=True)

我使用 Django Tastypie 作为我的休息框架。假设用户决定他们希望查看 10 公里半径内的所有照片。怎么能做到这一点?下面是我的资源:

class PhotosNearMe(ModelResource):
photographer = fields.ForeignKey(PhotographerResource, 'photographer', full=True)
class Meta:
    queryset = Photo.objects.all()
    resource_name = 'photos-near-me'
    fields = ['id', 'title', 'description', 'latitude','longitude','photographer']
    authentication = BasicAuthentication()
    authorization = DjangoAuthorization()
    serializer = Serializer(formats=['json'])
    include_resource_uri = False
    filtering = {
            'photographer' : ALL_WITH_RELATIONS,

}

def get_object_list(self, request):
        return super(PhotosNearMe, self).get_object_list(request).filter(....)

这是我遇到麻烦的地方。正如我之前提到的,用户将能够向我发送他们的坐标,我可以保存它们。就像是:

 lati = bundle.obj.latitude
 longi = bundle.obj.longitude

稍后我可以使用 lat 和 long 过滤数据库中 10 公里半径内的所有图像。问题是,怎么做?我想按某种范围过滤吗?

编辑**

我发现了一些我可能会使用的东西,在给定坐标的某个范围内查找项目

无论如何我可以实现这个吗?

4

1 回答 1

6

如果您要处理大量地理性质的数据,您可以考虑 GeoDjango,它支持空间查找。但是,它仅适用于某些后端,因此如果您的堆栈不符合要求,则可能需要进行更多设置。

否则,另一种选择是做一些几何图形并计算您的点周围的边界圆,然后对其进行过滤。 这是一个例子,看起来还有很多其他关于如何做到这一点的文章。

编辑:在回答您有关如何执行此操作的问题时,我假设您的意思是第二部分。我不是 TastyPie 方面的专家,但您认为您将不得不这样做:

  1. 获取用户的经纬度坐标
  2. 计算距离——看起来您可以在 SQL 中(或此处)本地执行此操作,但我认为这比最初出现的要复杂。做一个正方形可能更容易,因为在这里计算最小值和最大值很容易
  3. 根据最小和最大坐标对 get_object_list 应用过滤器。

似乎所有这些都属于ModelResource.build_filters

于 2013-07-16T02:09:00.630 回答