2013-10-03 5 views
0

Моя модель имеет два поля (широта и долгота), которые я хочу объединить, чтобы сформировать точечный объект. Тем не менее, я не могу понять, как фильтр на основе комбинации этих значений:Django: фильтрация Queryset из двух полей модели

Например:

>>> from django.contrib.gis.geos import Point 
>>> lat = 5 
>>> lon = 1 
>>> pnt = Point(lat, lon) 
>>> buf = pnt.buffer(0.0001) 
>>> z = Thing.objects.filter(pnt__intersects=buf) 

FieldError: Cannot resolve keyword 'pnt' into field. ## I dont have a model field named pnt 

Я понимаю, что это не правильный подход, но я думаю, что это иллюстрирует проблему, что я иметь. Как я могу объединить два поля модели - lat + lon - в объект Point, а затем фильтровать на основе этой точки?


EDIT: добавление вещь модель

class Thing(models.Model): 
    lat = models.FloatField() 
    lon = models.FloatField() 
+1

Как определяется модель 'Thing'? – karthikr

+0

Добавлены соответствующие поля модели над @karthikr. Дайте мне знать, если я упустил какую-либо важную информацию, и я добавлю ее. Спасибо за любые идеи, которые могут помочь! –

+0

'Thing.objects.filter (pnt' ожидает, что' pnt' будет атрибутом модели. – karthikr

ответ

1

Самый простой способ сделать это, как @karthikr сказал в комментариях к вашему вопросу, как раз и два:

z = Thing.objects.filter(lat=pnt.get_x(), lng = pnt.get_y()) 

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

psuedocode:

class Thing(models.Model): 
    point = models.ForeignKey('Point') 

class Point(models.Model): 
    lat = models.FloatField() 
    lon = models.FloatField() 


z = Thing.objects.filter(point = Point.objects.get(lat, long)) 

В противном случае, я не думаю, что есть способ сделать то, что вы просите.

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