#14161: GeoDjango autofield makes transaction fail
-------------------------------------------+--------------------------------
Reporter: [email protected] | 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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/django-updates?hl=en.