假设我有一个照片模型。在照片模型中,我的照片模型中有经度和纬度字段。
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公里半径内的所有图像。问题是,怎么做?我应该按某种范围过滤吗?
编辑**
我发现了一些我可能会使用的东西,在给定坐标的特定范围内查找项目
有什么我可以实现的吗?
如果你要处理大量的地理数据,你可以考虑GeoDjango,它支持空间查找。然而,它只适用于某些后端,因此如果您的堆栈不满足要求,则可能需要更多的设置。
否则,另一种选择是做一个小几何体,计算点周围的边界圆,并对其进行过滤。这是一个例子,看起来还有很多其他关于如何做到这一点的文章。
编辑:在回答你关于如何做到这一点的问题时,我假设你指的是第二部分。我不是TastyPie的专家,但在你看来,你必须这样做:
- 获取用户的经纬度坐标
- 计算一个距离——看起来你可以在SQL(或这里)中原生地这样做,但我认为这比最初看起来更复杂。做平方可能更容易,因为在这里计算最小值和最大值很容易
- 根据最小和最大坐标对get_object_list应用过滤器
所有这些似乎都属于ModelResource.build_filters.