2012-04-04 4 views
0

У меня есть следующая таблица и последовательность в моем PostGreSQL-8.4 базы данных:Django и PostgreSQL последовательность для первичного ключа Autoincrement

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; 

Следующая вместо этого мой Django модели:

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

Выполнение следующих запрос:

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

Я получаю ошибку:

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

Почему я это понимаю? Читая документацию, я ожидал, что значение id будет выбрано автоматически с использованием последовательности ...

+0

ли вы создать таблицу с помощью SyncDB? В моей БД все поля идентификатора являются серийными: id serial NOT NULL, – Mikael

+0

Нет, я создал таблицу db и модель отдельно. – caneta

+0

Прошло довольно много времени, но если кто-то еще появится, вы должны добавить ['managed = False'] (https://docs.djangoproject.com/en/1.10/ref/models/options/#managed) в свой мета-параметры модели при создании таблиц самостоятельно. – spectras

ответ

4

На самом деле я предоставляю это как ответ. Серийный тип данных в postgres представляет собой автоматическое инкрементное четырехбайтовое целое число. Если вы измените свой идентификатор от целого к серийному, это сработает.

id serial NOT NULL 

Подробнее: http://www.postgresql.org/docs/8.4/static/datatype.html

+0

Да, теперь это работает! Решение действительно заключалось в том, чтобы изменить «integer» на «serial». – caneta

Смежные вопросы