2015-05-06 2 views
3

Я пытаюсь вернуть набор запросов с расстояниями от родственной модели.GeoDjango расстояние родственной модели

models.py (упрощенный)

class Store(models.Model): 
    geopoint = models.PointField(srid=4326) 

    objects = models.GeoManager() 


class HashTag(models.Model): 
    tag = models.CharField(max_length=100) 


class Label(models.Model): 
    hashtags = models.ManyToManyField(HashTag) 
    store = models.ForeignKey(Store) 

Что мне нужно, чтобы вернуть те объекты этикетки, которые имеют определенные теги/метки упорядоченные по расстоянию от данной точки.

Этикетки могут быть найдены:

Label.objects.filter(hashtags__in=tags) 

Расстояния доступны на объектах Магазин рассчитывается с:

Store.objects.filter(label__hashtags__in=tags) 
      .distance(location).order_by('distance') 

То, что я хотел бы сделать, это выполнить запрос на Label таблицы в вернуть все, но я подозреваю, что это невозможно.

Попытка метод distance по результатам QuerySet в:

TypeError: ST_Distance output only available on GeometryFields. 

В противном случае было бы целесообразно, чтобы сделать наиболее эффективной следующая лучшая вещь. Единственное решение, которое я могу придумать, - это выполнить оба запроса и объединить результаты в набор.

+0

Наткнулся через это ровно через год после того, как он был отправлен! Вы занимаете дистанцию ​​(местоположение), но ваше поле кажется геометризованным. Так разве ваш запрос не должен быть расстоянием («геотоном»)? – e4c5

+0

Эй, @RobinElvin Я отправил покойный (только на 2 года) ответ. Взглянуть! –

ответ

0

Это, безусловно, можно достичь запрос:

  • Используйте annotate(), чтобы добавить значение расстояния на каждом Label объекта.
  • Используйте функцию Distance() для вычисления расстояния между каждым магазином geopoint и location точка

запрос должен выглядеть следующим образом:

from django.contrib.gis.db.models.functions import Distance 

Label.objects.filter(hashtags__in=tags) 
      .annotate(distance=Distance('store__geopoint', location)) 
      .order_by('distance') 
Смежные вопросы