Opened 5 years ago

Closed 5 years ago

#14922 closed (invalid)

Failure with spatial queries spanning a foreign key join

Reported by: crucialfelix Owned by: nobody
Component: GIS Version: 1.2
Severity: Keywords:
Cc: crucialfelix@… Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:


class Apt(Model):

    geo = models.PointField(srid=4326,editable=False,default=Point(0,0))

class AptStatus(Model):
    apt = models.ForeignKey(Apt)

from django.contrib.gis.geos import Polygon
box = Polygon.from_bbox(10,20,10,20)
FieldError: Join on field 'geo' not permitted. Did you misspell 'within' for the lookup type?

however I've found a nullable foreign key query did work:

class Apt(Model):

    geo = models.PointField(srid=4326,editable=False,default=Point(0,0))
    bldg = models.ForeignKey(Bldg,null=True)

class Bldg(Model):

    geo = models.PointField(srid=4326,editable=False,default=Point(0,0))


      FROM "nsproperties_apt"
      INNER JOIN "nsproperties_bldg" ON ("nsproperties_apt"."bldg_id" = "nsproperties_bldg"."id")
      WHERE ST_Within("nsproperties_bldg"."geo",
                      ST_GeomFromEWKB(E'\\001\\003\\000\\000 \\346\\020\\000\\000\\001\\000\\000\\000\\005\\000\\000\\000\\000\\000\\000\\000\\024\\333\\200@\\334\\302Z\\310\\321\\177V\\300\\000\\000\\000\\000\\024\\333\\200@t"\\271,\\272\\177V\\300\\000\\000\\000\\0008\\230\\201@t"\\271,\\272\\177V\\300\\000\\000\\000\\0008\\230\\201@\\334\\302Z\\310\\321\\177V\\300\\000\\000\\000\\000\\024\\333\\200@\\334\\302Z\\310\\321\\177V\\300'))LIMIT 21

Change History (2)

comment:1 Changed 5 years ago by crucialfelix

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset


comment:2 Changed 5 years ago by crucialfelix

  • Resolution set to invalid
  • Status changed from new to closed

figured it out: its because a GeoManager is required if any part of the query needs spatial lookups.

I expected that since Apt has a GeoManager that it would be used for queries on its fields.

I guess if the join is happening on another model's fields then the manager for that other model should be used.
otherwise its force me to add a geo manager to a class that has no geo fields, but that's not too bad.

Note: See TracTickets for help on using tickets.
Back to Top