¿Cómo acceder a un campo de geometría (punto) en la base de datos PostGIS desde Django?
En mi proyecto estoy usando PostgreSQL / PostGIS como la base de datos y Django condjango.contrib.gis
configurado losmesa existente pois
contiene geoespacialpunto datos. Aquí hay un extracto de la declaración de creación de SQL:
CREATE TABLE pois
(
ogc_fid serial NOT NULL,
the_geom geometry(Point,900914),
name character varying(254),
-- ...
Genere el modelo Django con el siguiente comando:
$ python manage.py inspectdb
El modelo generado se ve así:
from django.contrib.gis.db import models
class POIs(models.Model):
ogc_fid = models.AutoField(primary_key=True)
the_geom = models.TextField(blank=True, null=True) # This field type is a guess.
name = models.CharField(max_length=254, blank=True, null=True)
class Meta:
managed = False
db_table = 'pois'
Agrego el siguiente campo para sobrescribir la administración predeterminada con una instancia específica de GeoDjango:
objects = models.GeoManager()
Ahora quiero reemplazarthe_geom = models.TextField()
con eltipo de datos correcto que debería sermodels.PointField()
omodels.GeometryField()
. Probé los dos. Luego pruebo el modelo en el shell de Python:
$ python manage.py shell
Python 3.4.3 (default, Jul 28 2015, 18:20:59)
In [1]: from berlin import models
In [2]: models.POIs.objects.first()
Esto falla y lo siguientetraza es salida:
/home/user/.virtualenvs/myproject/lib/python3.4/site-packages/django/contrib/ \
gis/db/models/fields.py in select_format(self, compiler, sql, params)
57 else:
58 sel_fmt = '%s'
---> 5,9 if connection.ops.select:
60 # This allows operations to be done on fields in the SELECT,
61 # overriding their values -- used by the Oracle and MySQL
AttributeError: 'DatabaseOperations' object has no attribute 'select'
Ahi estaNo hay error cuando dejo el modelo conmodels.TextField
. Entonces se emite el valor de la cadena.