2012-04-04 4 views
0

je le tableau suivant et séquence dans ma base de données postgresql-8.4:Django et la séquence PostgreSQL pour autoincrement clé primaire

CREATE TABLE complexobjectpy 
(
    id integer NOT NULL, 
    the_geom geometry, 
    semcat integer, 
    CONSTRAINT complexobjectpy_pkey PRIMARY KEY (id), 
    CONSTRAINT enforce_dims_the_geom CHECK (st_ndims(the_geom) = 2), 
    CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = 900913) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE complexobjectpy OWNER TO tss; 

CREATE SEQUENCE seq_complexobjectpy 
    INCREMENT 1 
    MINVALUE 1 
    MAXVALUE 9223372036854775807 
    START 1 
    CACHE 1; 
ALTER TABLE seq_complexobjectpy OWNER TO tss; 

Ce qui suit est plutôt mon modèle Django:

class Complexobjectpy(models.Model): 
    the_geom = models.GeometryField(srid=900913) 
    semcat = models.IntegerField() 
    objects = models.GeoManager() 
    class Meta: 
     db_table = u'complexobjectpy' 

effectuant les opérations suivantes requête:

myObj = Complexobjectpy(semcat=50, the_geom=geometryMerged.wkt) 
myObj.save(using='u1') 

Je reçois l'erreur:

IntegrityError: null value in column "id" violates not-null constraint 

Pourquoi je reçois ça? En lisant la documentation je m'attendais à ce que la valeur d'id soit choisie automatiquement en utilisant la séquence ...

+0

Avez-vous créé la table en utilisant syncdb? Dans ma base de données, tous les champs ID sont en série: id série NOT NULL, – Mikael

+0

Non, j'ai créé la table db et le modèle séparément. – caneta

+0

Cela fait un certain temps, mais si quelqu'un d'autre vient, vous devriez ajouter ['managed = False'] (https://docs.djangoproject.com/fr/1.10/ref/models/options/#managed) dans votre les options méta du modèle lorsque vous créez vous-même les tables. – spectras

Répondre

4

En fait je fournisse ceci comme réponse. Le type de données serial dans postgres est un entier automatique incrémental à quatre octets. Si vous changez votre identifiant d'un nombre entier à un autre, cela fonctionnera.

id serial NOT NULL 

En savoir plus: http://www.postgresql.org/docs/8.4/static/datatype.html

+0

Ouais, maintenant ça marche! La solution était en effet de changer "entier" avec "série". – caneta

Questions connexes