#14161: GeoDjango autofield makes transaction fail -------------------------------------------+-------------------------------- Reporter: miguel.araujo.pe...@gmail.com | Owner: nobody Status: new | Milestone: Component: GIS | Version: 1.2 Keywords: postGIS, autofield, geodjango | Stage: Unreviewed Has_patch: 0 | -------------------------------------------+-------------------------------- Hi there,
This is my GeoDjango model: {{{ from django.contrib.gis.db import models from django.db.models import fields class Spot(models.Model): idSpot = fields.AutoField(primary_key = True) code = models.CharField(max_length = 30) poly = models.PointField(spatial_index = True, srid = 4326, geography = True) objects = models.GeoManager() }}} When I do this: {{{ python manage.py shell from location.models import Spot from django.contrib.gis.geos import Point spot = Spot("park",Point(10,10)) spot.save() }}} What I get is: {{{ --------------------------------------------------------------------------- ValueError Traceback (most recent call last) /home/map/mercurial/telollevo/src/telollevogis/<ipython console> in <module>() /usr/local/lib/python2.6/dist-packages/django/db/models/base.pyc in save(self, force_insert, force_update, using) 433 if force_insert and force_update: 434 raise ValueError("Cannot force both insert and updating in model saving.") --> 435 self.save_base(using=using, force_insert=force_insert, force_update=force_update) 436 437 save.alters_data = True /usr/local/lib/python2.6/dist-packages/django/db/models/base.pyc in save_base(self, raw, cls, origin, force_insert, force_update, using) 495 # Determine whether a record with the primary key already exists. 496 if (force_update or (not force_insert and --> 497 manager.using(using).filter(pk=pk_val).exists())): 498 # It does already exist, so do an UPDATE. 499 if force_update or non_pks: /usr/local/lib/python2.6/dist-packages/django/db/models/query.pyc in filter(self, *args, **kwargs) 548 set. 549 """ --> 550 return self._filter_or_exclude(False, *args, **kwargs) 551 552 def exclude(self, *args, **kwargs): /usr/local/lib/python2.6/dist-packages/django/db/models/query.pyc in _filter_or_exclude(self, negate, *args, **kwargs) 566 clone.query.add_q(~Q(*args, **kwargs)) 567 else: --> 568 clone.query.add_q(Q(*args, **kwargs)) 569 return clone 570 /usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.pyc in add_q(self, q_object, used_aliases) 1129 else: 1130 self.add_filter(child, connector, q_object.negated, -> 1131 can_reuse=used_aliases) 1132 self.where.end_subtree() 1133 if connector == OR: /usr/local/lib/python2.6/dist-packages/django/db/models/sql/query.pyc in add_filter(self, filter_expr, connector, negate, trim, can_reuse, process_extras) 1069 else: 1070 self.where.add((Constraint(alias, col, field), lookup_type, value), -> 1071 connector) 1072 1073 if negate: /usr/local/lib/python2.6/dist- packages/django/contrib/gis/db/models/sql/where.pyc in add(self, data, connector) 39 isinstance(obj.field, GeometryField) ): 40 data = (GeoConstraint(obj), lookup_type, value) ---> 41 super(GeoWhereNode, self).add(data, connector) 42 43 def make_atom(self, child, qn, connection): /usr/local/lib/python2.6/dist-packages/django/db/models/sql/where.pyc in add(self, data, connector) 64 65 if hasattr(obj, "prepare"): ---> 66 value = obj.prepare(lookup_type, value) 67 super(WhereNode, self).add((obj, lookup_type, annotation, value), 68 connector) /usr/local/lib/python2.6/dist-packages/django/db/models/sql/where.pyc in prepare(self, lookup_type, value) 297 def prepare(self, lookup_type, value): 298 if self.field: --> 299 return self.field.get_prep_lookup(lookup_type, value) 300 return value 301 /usr/local/lib/python2.6/dist- packages/django/db/models/fields/__init__.pyc in get_prep_lookup(self, lookup_type, value) 290 return value 291 elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte'): --> 292 return self.get_prep_value(value) 293 elif lookup_type in ('range', 'in'): 294 return [self.get_prep_value(v) for v in value] /usr/local/lib/python2.6/dist- packages/django/db/models/fields/__init__.pyc in get_prep_value(self, value) 474 if value is None: 475 return None --> 476 return int(value) 477 478 def contribute_to_class(self, cls, name): ValueError: invalid literal for int() with base 10: 'parque' }}} Instead if I do: {{{ spot = Spot(1,"park",Point(10,10)) spot.save() }}} Everything goes right if primary key 1 does not already exist. If I check table in the database, record is there. Also there is a sequence associated to the primary key. {{{ location=# \d location_spot Tabla «public.location_spot» Columna | Tipo | Modificadores ---------+-----------------------+---------------------------------------------------------------------------- idSpot | integer | not null valor por omisión nextval('"location_spot_idSpot_seq"'::regclass) code | character varying(30) | not null poly | geography(Point,4326) | not null Índices: "location_spot_pkey" PRIMARY KEY, btree ("idSpot") "location_spot_poly_id" gist (poly) }}} Using autofield in Django doesn't work this way, so I think it might be a bug. I'm using: - Django 1.2.1 final - Latest GEOS version - Latest Proj version - PostGIS 1.5 latest version - Ubuntu Linux 9.10 Followed these instructions for installation [http://docs.djangoproject.com/en/dev/ref/contrib/gis/install/#building- from-source] Thanks, regards Miguel Araujo -- Ticket URL: <http://code.djangoproject.com/ticket/14161> Django <http://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To post to this group, send email to django-upda...@googlegroups.com. To unsubscribe from this group, send email to django-updates+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-updates?hl=en.