Django ships first-class PostgreSQL support—JSONField, ArrayField, indexes, and migrations emitting Postgres DDL.
settings.py DATABASES
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myapp',
'USER': 'myapp_user',
'PASSWORD': os.environ['DB_PASSWORD'],
'HOST': '127.0.0.1',
'PORT': '5432',
'CONN_MAX_AGE': 60,
}
}
Postgres-specific fields
from django.contrib.postgres.fields import ArrayField
from django.db import models
class Article(models.Model):
tags = ArrayField(models.CharField(max_length=40), default=list)
meta = models.JSONField(default=dict)Requires PostgreSQL backend—SQLite dev DB cannot run these migrations unchanged.
Migrations and raw SQL
Use RunSQL for partial indexes and extensions. Keep dev/prod engines aligned to avoid surprise migration failures.
Important interview questions and answers
- Q: Why not SQLite in production Django?
A: Concurrency and Postgres-specific fields—SQLite fine for local learning only. - Q: django.contrib.postgres?
A: Optional contrib package with Postgres field types and lookups.
Self-check
- Which ENGINE string selects PostgreSQL?
- What field type maps to JSONB?
Pitfall: SQLite dev + Postgres-only fields break migrations at deploy—align engines early.
Interview prep
- ENGINE for Postgres?
django.db.backends.postgresql.
- JSONField maps to?
JSONB on PostgreSQL backend.