简体   繁体   中英

How to filter a django queryset based on Location coordinates?

Let's say that I have a photo model. In the photo model, I have longitude and latitude fields in my photo model.

 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)

I use Django Tastypie as my rest framework. Let's say a user decides they'd like to see all the photos within a 10 km radius. How can one achieve this? Here is my resource below:

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(....)

This is where I am having trouble. As I mentioned before, the user will be able to send me their coordinates and I can save them. Something like:

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

I can later use lat and long to filter through all the images in the database that are within a 10 km radius. The question is, how? am I suppose to filter by some sort of range?

EDIT**

I have found something that I could perhaps use, Find items within a certain range of given coordinate

Is there anyway I can implement this?

If you are going to be handling a lot of data that is geographic in nature, you may consider GeoDjango, which has support for spatial lookups . However, it only works with certain backends, so it may require a lot more to get set up if your stack doesn't meet the requirements.

Otherwise, the other option would be to do a little geometry and calculate the bounding circle around your point, and filter on that. Here's an example , and it looks like there are plenty of other writeups on how to do this.

EDIT: in response to your question on how to do this, I am assuming you mean the second part. I am not an expert in TastyPie, but it looks like you will have to this in your view:

  1. Get the user's lat an longitude coordinates
  2. Calculate a distance -- it looks like you can do this natively in SQL ( or here ), but I think this is more complicated than it initially appears. It may be easier to do a square, since it's easy to calculate min and maxs here
  3. Apply a filter to get_object_list based on the min and max coordinates.

It seems like all of these would belong in ModelResource.build_filters .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM