Есть модель Deal
, описывающая предложения:
class Deal(geomodels.Model):
...
objects = geomodels.GeoManager()
...
которые могут одновременно проходит в разных местах.
Для указания таких мест используется модель Location
:
class Location(geomodels.Model):
deal = models.ForeignKey(Deal, related_name='locations')
name = models.CharField(u'Адрес/название места', max_length=256)
coords = geomodels.PointField(u'Координаты места', geography=True)
phone = models.CharField(u'Телефон места', max_length=32)
objects = geomodels.GeoManager()
Стоит задача получить список предложений, отсортировав его по удалённости от текущей точки.
В интернете быстро нашлось решение. Но, несмотря на описанный там метод, показанную далее ошибку победить не удалось:
TypeError: ST_Distance output only available on GeometryFields.
Делал так:
$ ./manage.py shell
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.contrib.gis.geos import Point
>>> from deals.models import Deal
>>> me = Point(37.4503600000000034, 55.8064620000000033)
>>> qs = Deal.objects.free().distance(me, field_name='locations__coords').order_by('distance')
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/me/env/src/django/django/contrib/gis/db/models/query.py", line 100, in distance
return self._distance_attribute('distance', geom, **kwargs)
File "/home/me/env/src/django/django/contrib/gis/db/models/query.py", line 576, in _distance_attribute
procedure_args, geo_field = self._spatial_setup(func, field_name=kwargs.get('field_name', None))
File "/home/me/env/src/django/django/contrib/gis/db/models/query.py", line 452, in _spatial_setup
raise TypeError('%s output only available on GeometryFields.' % func)
TypeError: ST_Distance output only available on GeometryFields.
Есть не моё мнение, что во всём виновато наличие нескольких локаций для одного предложения. Но я в этом не уверен, а правильное решение пока найти не удалось.
Мысли, идеи принимаются.
Updated 22 Feb. 2012, 16:01 by RaD.