2013-07-16 48 views
1

假设我有一个照片模型。在照片模型中,我在我的照片模型中有经纬度字段。如何根据位置坐标过滤Django查询集?

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作为我的rest框架。比方说,用户决定他们希望看到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和长期通过有10公里半径范围内的数据库中的所有图像进行过滤。问题是,如何?我想过滤某种范围?

编辑**

我发现的东西,我也许可以使用,Find items within a certain range of given coordinate

反正我有可以实现这一点?

+0

也许看看[GeoDjango](http://geodjango.org/) – Amadan

回答

5

如果你打算处理大量的地理数据,你可以考虑GeoDjango,它支持spatial lookups。但是,它仅适用于某些后端,因此如果您的堆栈不符合要求,可能需要更多设置。

否则,另一种选择是做一个小几何并计算围绕你的点的边界圆,并对其进行过滤。 Here's an example,看起来好像有很多关于如何做到这一点的其他文章。

编辑:在回答你关于如何做到这一点的问题时,我假设你的意思是第二部分。我不是在TastyPie的专家,但它看起来像你将不得不这样在您的看法:

  1. 获取用户的纬度的纬度坐标
  2. 计算距离 - 它看起来像你可以做到这一点natively in SQLor here),但我认为这比最初看起来更复杂。由于可以很容易地计算最小值和最大值,因此可以更容易地进行平方运算。
  3. 根据最小和最大坐标对get_object_list应用过滤器。

看来所有这些都属于ModelResource.build_filters

+0

用上面的get_object_list做这件事的pythonic方式是什么? – noahandthewhale

+0

查看我的编辑。根据TastyPie的灵活性,您可能需要编写一些更多的自定义代码,而不是使用内置的ModelResource功能。除非您使用GeoDjango,否则我猜Django ORM或TastyPie可能不适合更复杂的SQL语句,例如计算距离所需的SQL语句。 – hgcrpd