Opened 15 years ago
Closed 15 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: | no | UI/UX: | no |
Description
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)
AptStatus.objects.filter(apt__geo__within=box)
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))
Apt.objects.filter(bldg__geo__within=box)
SELECT ...
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 by , 15 years ago
comment:2 by , 15 years ago
| Resolution: | → invalid |
|---|---|
| Status: | new → 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.
postgres