2013-07-16 2 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 в качестве рамки для отдыха. Предположим, пользователь решил, что они захотят увидеть все фотографии в радиусе 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 

можно позже использовать латы и долго фильтровать через все изображения в базе данных, которые находятся в радиусе 10 км. Вопрос в том, как? я полагаю, что фильтр по какой-то области?

EDIT **

Я нашел то, что я мог бы, возможно, использовать, Find items within a certain range of given coordinate

Есть в любом случае я могу это реализовать?

+0

Возможно, посмотрите на [GeoDjango] (http://geodjango.org/) – Amadan

ответ

5

Если вы собираетесь обрабатывать большое количество данных, имеющих географический характер, вы можете рассмотреть GeoDjango, у которого есть поддержка spatial lookups. Однако он работает только с некоторыми бэкэндами, поэтому может потребоваться гораздо больше, чтобы настроить, если ваш стек не соответствует требованиям.

В противном случае другой вариант состоял бы в том, чтобы сделать небольшую геометрию и вычислить ограничивающий круг вокруг вашей точки и отфильтровать это. Here's an example, и похоже, что есть много других комментариев о том, как это сделать.

EDIT: в ответ на ваш вопрос о том, как это сделать, я предполагаю, что вы имеете в виду вторую часть. Я не эксперт в TastyPie, но похоже, что вы должны это на ваш взгляд:

  1. Получить пользователя Lat с долготы
  2. Вычислить расстояние - это выглядит, как вы можете сделать это natively in SQL (or here), но я думаю, что это сложнее, чем первоначально. Может быть проще сделать квадрат, так как здесь легко вычислять min и maxs.
  3. Применить фильтр к get_object_list на основе минимальных и максимальных координат.

Кажется, что все они будут принадлежать ModelResource.build_filters.

+0

, каков был бы питонический способ сделать это с помощью get_object_list, который у меня выше? – noahandthewhale

+0

Смотрите мои правки. В зависимости от того, насколько гибким является TastyPie, вам может потребоваться написать еще один пользовательский код вместо использования встроенных функций ModelResource. Если вы не используете GeoDjango, я предполагаю, что Django ORM или TastyPie могут не играть хорошо с более сложными операторами SQL, такими как те, которые необходимы для вычисления расстояния. – hgcrpd

Смежные вопросы