Django supports PostgreSQL 9.0 and higher. It requires the use of Psycopg2 2.0.9 or higher.
Django needs the following parameters for its database connections:
client_encoding
: 'UTF8'
,default_transaction_isolation
: 'read committed'
by default, or the value set in the connection options (see here),timezone
: 'UTC'
when USE_TZ
is True
, value of TIME_ZONE
otherwise.If these parameters already have the correct values, Django won't set them for every new connection, which improves performance slightly. You can configure them directly in postgresql.conf
or more conveniently per database user with ALTER ROLE
.
Django will work just fine without this optimization, but each new connection will do some additional queries to set these parameters.
Like PostgreSQL itself, Django defaults to the READ COMMITTED
isolation level. If you need a higher isolation level such as REPEATABLE READ
or SERIALIZABLE
, set it in the OPTIONS
part of your database configuration in DATABASES
:
import psycopg2.extensions DATABASES = { # ... 'OPTIONS': { 'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE, }, }
Under higher isolation levels, your application should be prepared to handle exceptions raised on serialization failures. This option is designed for advanced uses.
When specifying db_index=True
on your model fields, Django typically outputs a single CREATE INDEX
statement. However, if the database type for the field is either varchar
or text
(for example, used by CharField
, FileField
, and TextField
), then Django will create an additional index that uses an appropriate PostgreSQL operator class for the column. The extra index is necessary to correctly perform lookups that use the LIKE
operator in their SQL, as is done with the contains
and startswith
lookup types.