Opened 15 years ago
Closed 15 years ago
#14161 closed (fixed)
GeoDjango autofield makes transaction fail
| Reported by: | Owned by: | nobody | |
|---|---|---|---|
| Component: | GIS | Version: | 1.2 |
| Severity: | Keywords: | postGIS, autofield, geodjango | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
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
I'm look at this at the moment while I was debugging django code to see If I could see where the bug is and submit a patch.
The bug of course is in my code. I should be doing:
which I'm pretty sure I tried yesterday night and didn't work, but I guess I misspelled something and I didn't notice (late hacking). This is such dumb ticket. I'm very sorry about it, please delete it.