﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
14161	GeoDjango autofield makes transaction fail	miguel.araujo.perez@…	nobody	"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"		closed	GIS	1.2		fixed	postGIS, autofield, geodjango		Unreviewed	0	0	0	0	0	0
