Query with GeoDjango

422 views
Skip to first unread message

Odagi

unread,
Jun 30, 2012, 8:18:27 PM6/30/12
to django...@googlegroups.com
Hello all. I'm wondering how to resolve this problem with a GeoDjango.This are my models:


from django.db import models
from django.contrib.gis.db import models as geomodels
from django.contrib.gis.geos import Point
from django.contrib.gis.measure import D

class Place(geomodels.Model):
    name = models.CharField(max_length=50)
    point = geomodels.PointField(null=True)
    objects = geomodels.GeoManager()

    def __unicode__(self):
        return u"%s the place" % self.name


class Restaurant(models.Model):
    place = models.OneToOneField(Place, primary_key=True)
    serves_hot_dogs = models.BooleanField()
    serves_pizza = models.BooleanField()

    def __unicode__(self):
        return u"%s the restaurant" % self.place.name

    

How can I get all Restaurants that serve pizza in a radio of 45km of a given (geolocation) point?
I'm trying something like:

pnt = Point(-34.5875015259, -58.6725006104)
Restaurant.objects.all().filter(place__point__distance_lte=(pnt, D(km=45)))

But it's not working:
Join on field 'point' not permitted. Did you misspell 'distance_lte' for the lookup type?

Any ideas?
Thanks in advance.




Nikolas Stevenson-Molnar

unread,
Jun 30, 2012, 8:19:58 PM6/30/12
to django...@googlegroups.com
Try a double underscore between distance and lte.

_Nik
> --
> You received this message because you are subscribed to the Google
> Groups "Django users" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/django-users/-/eGmII8v1GMMJ.
> To post to this group, send email to django...@googlegroups.com.
> To unsubscribe from this group, send email to
> django-users...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/django-users?hl=en.


Ethan Jucovy

unread,
Jun 30, 2012, 8:24:04 PM6/30/12
to django...@googlegroups.com
On Sat, Jun 30, 2012 at 8:19 PM, Nikolas Stevenson-Molnar <nik.m...@consbio.org> wrote:
Try a double underscore between distance and lte.


But, you need to use a `objects = GeoManager()` on the Restaurants model (as well as the Place model) per the docs: https://docs.djangoproject.com/en/dev/ref/contrib/gis/model-api/#django.contrib.gis.db.models.GeoManager

 -Ethan

Odagi

unread,
Jun 30, 2012, 8:31:14 PM6/30/12
to django...@googlegroups.com
It's working! Thanks a lot. 
Is There a problem with mixing regular models fields with geomodels ones?

Ethan Jucovy

unread,
Jun 30, 2012, 8:42:12 PM6/30/12
to django...@googlegroups.com
On Sat, Jun 30, 2012 at 8:31 PM, Odagi <fcmi...@gmail.com> wrote:
It's working! Thanks a lot. 
Is There a problem with mixing regular models fields with geomodels ones?

No, there's no problem, as long as you remember to use a GeoManager on every model that ever does geospatial queries (whether or not it has any geospatial fields itself)

-Ethan

Jani Tiainen

unread,
Jul 1, 2012, 7:43:43 AM7/1/12
to django...@googlegroups.com
I thought that it was fixed along with https://code.djangoproject.com/ticket/12344 ... Bascially it aoubt that Django picks "origin manager" to be used in related models (and thus related model manager) as well and that seem to cause queries to fail.



--
You received this message because you are subscribed to the Google Groups "Django users" group.
To post to this group, send email to django...@googlegroups.com.
To unsubscribe from this group, send email to django-users...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.



--
Jani Tiainen

- Well planned is half done, and a half done has been sufficient before...

Emiliano M. Rudenick

unread,
Jul 1, 2012, 7:27:45 PM7/1/12
to django...@googlegroups.com
El Sat, 30 Jun 2012 17:18:27 -0700 (PDT)
Odagi <fcmi...@gmail.com> escribió:
> class Restaurant(models.Model):
> place = models.OneToOneField(Place, primary_key=True)
> serves_hot_dogs = models.BooleanField()
> serves_pizza = models.BooleanField()

Use GeoManager in your Restaurant model:

class Restaurant(models.Model):
place = models.OneToOneField(Place, primary_key=True)
serves_hot_dogs = models.BooleanField()
serves_pizza = models.BooleanField()
objects = geomodels.GeoManager()

Greatings!
Reply all
Reply to author
Forward
0 new messages