Opened 9 years ago

Closed 9 years ago

#5258 closed (worksforme)

SlugField not getting an index if attribute of unique=True also set

Reported by: odonian@… Owned by: Adrian Holovaty
Component: Database layer (models, ORM) Version: master
Severity: Keywords: SlugField, unique, index, PostgreSQL
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: UI/UX:


I'm using Postgres 8.2 and I'm noticing that for all Django
models where I have a SlugField, the database index seems to be
missing where I also set unique=True in the SlugField definition. By
default, SlugField has db_index=True, according to the docs, and I do
see an index for SlugFields where I didn't set unique=True. i.e.

foo = models.SlugField() ----> index is present in Postgres, as

bar = models.SlugField(unique=True) ---> index is not present in

I also have other attributes on the SlugField, like maxlength,
blank=True and null=True, but the only consistent difference between
the SlugFields where an index is not present automatically vs those
that are seems to be the attribute unique=True. Manually creating the
index works fine.

Change History (2)

comment:1 Changed 9 years ago by Collin Grady <cgrady@…>

Needs documentation: unset
Needs tests: unset
Patch needs improvement: unset

Doesn't UNIQUE imply an index in postgres?

comment:2 Changed 9 years ago by Matt McClanahan <cardinal@…>

Resolution: worksforme
Status: newclosed

I can't reproduce this in trunk (rev 6020), with postgresql 8.1 or 8.2. Using the following model:

class SlugTest(models.Model):
        slug    1       2       3       4       5       6
    unique      1       1       1       0       0       0
    blank       1       1       0       0       1       1
    null        1       0       1       0       1       0
    slug1 = models.SlugField(max_length=8, unique=True, blank=True, null=True)
    slug2 = models.SlugField(max_length=8, unique=True, blank=True)
    slug3 = models.SlugField(max_length=8, unique=True, null=True) 
    slug4 = models.SlugField(max_length=8)
    slug5 = models.SlugField(max_length=8, blank=True, null=True)
    slug6 = models.SlugField(max_length=8, blank=True)

I get the following table:

                                Table "public.foo_slugtest"
 Column |         Type         |                         Modifiers                         
 id     | integer              | not null default nextval('foo_slugtest_id_seq'::regclass)
 slug1  | character varying(8) | 
 slug2  | character varying(8) | not null
 slug3  | character varying(8) | 
 slug4  | character varying(8) | not null
 slug5  | character varying(8) | 
 slug6  | character varying(8) | not null
    "foo_slugtest_pkey" PRIMARY KEY, btree (id)
    "foo_slugtest_slug1_key" UNIQUE, btree (slug1)
    "foo_slugtest_slug2_key" UNIQUE, btree (slug2)
    "foo_slugtest_slug3_key" UNIQUE, btree (slug3)
    "foo_slugtest_slug4" btree (slug4)
    "foo_slugtest_slug5" btree (slug5)
    "foo_slugtest_slug6" btree (slug6)

Please provide a reproducible example model if it's still a problem in the latest trunk.

Note: See TracTickets for help on using tickets.
Back to Top