About django-materialized-views
A skill for deciding when and how to use PostgreSQL materialized views with Django. It guides developers through design, integration, refresh, and verification while accounting for stale data and database workload.
Key features
- 01Assess whether a materialized view fits
- 02Design SQL output and indexes
- 03Integrate through Django migrations and models
- 04Plan and verify view refreshes
Use cases
- 01Speed up repeated expensive reads
- 02Add a read-only view to a Django app
- 03Choose a safe refresh strategy
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill django-materialized-viewsAfter installing, type/django-materialized-viewsin Claude Code to confirm it loaded.
Bundled filesreferences/materialized-view-patterns.md
Details
From the project READMEDjango Materialized Views
Use this skill when an expensive read query is reused often and can tolerate controlled staleness. Try query-plan, index, and ORM expression improvements first; materialized views add operational state.
Workflow
-
Confirm fit.
- The source query is expensive and stable.
- Consumers can accept stale data.
- Refresh cadence, ownership, and failure behavior are clear.
- PostgreSQL is the target database.
-
Design the materialized view.
- Define the SQL query and output columns.
- Add a unique column or unique column set if concurrent refresh is required.
- Add indexes for consumer queries against the view.
-
Integrate with Django.
- Create the view with
RunSQL. - Represent it as an unmanaged model with
managed = False. - Keep the unmanaged model fields aligned with the SQL output.
- Make writes impossible at the application boundary.
- Create the view with
-
Implement refresh.
- Use
REFRESH MATERIALIZED VIEWfor simple refreshes. - Use
REFRESH MATERIALIZED VIEW CONCURRENTLYonly when the view is already populated and has a qualifying unique index. - Schedule refresh through a management command, task queue, or database job.
- Use
See materialized-view-patterns.md for migration, model, and refresh templates.
Safety Notes
- A materialized view returns stored data; it is not automatically current.
- Concurrent refresh avoids locking out reads but has prerequisites and still allows only one refresh at a time per view.
- Refreshing a large view can be a major database workload. Measure it separately from reads.
Verification
Validate the SQL against source tables, test the unmanaged model reads, prove refresh behavior, and measure read latency before/after.