Changelog

To install unreleased versions of a workspace package, see developmental releases.

This changelog covers the whole workspace in one place: the core django-search-query package and the optional django-admin-search-query integration. Deliverables specific to the admin package name it in their heading.

django-search-query 0.1.0a1 (unreleased)

Upcoming changes will be written here.

Documentation

Tutorials, reference, and highlighted query examples (#4)

The docs are now a full guided site for both packages: a tutorial that runs a search against a real queryset, how-to guides, an API reference, and explanation pages. Query examples are syntax-highlighted, and an interactive install picker shows the matching pip/uv command for each package.

A dedicated query-language page with worked examples (#6)

The query language now has its own top-level page that shows the payoff up front: a search string becoming a Django Q, filtering a queryset, and the SQL it runs – with results checked against a live table so the examples stay honest. Query snippets are highlighted inline in prose too, not just in code blocks.

django-search-query 0.1.0a0 (2026-07-19)

django-search-query 0.1.0a0 is the first alpha of the workspace, shipping the core query language together with its optional Django admin integration. The core compiles a Lucene-inspired search string into a Django Q object, backed by a field registry that keeps the searchable surface decoupled from your models and a highlighter for syntax-colored search boxes. The companion django-admin-search-query brings the language to admin changelists, adding a client-side colored, autocompleting search input that degrades to a plain field without JavaScript. As an alpha, the APIs may still change before the 0.1.0 release.

What’s new

Structured search query language (#1)

Turn a user’s search string into a Django Q object with one search_query_to_q() call. The Lucene-inspired syntax covers field-scoped terms (status:open), quoted phrases, boolean AND/OR/NOT with grouping, comparison and range operators, wildcards, and +/- negation. Half-typed or unparseable input degrades to a match instead of raising, so a query runs while the user is still typing.

Searchable-field registry (#1)

A FieldRegistry declares which fields are searchable and maps user-facing names and aliases to ORM lookups, keeping the search surface decoupled from your models. Unknown fields and out-of-enum values are rejected as the query compiles, rather than silently mis-querying.

Query highlighting (#2)

highlight_query_spans() lexes a query string into contiguous (start, role, text) spans – fields, phrases, keywords, operators, negation, and wildcards – ready to drive a syntax-highlighted search box. A registry-aware pass flags unknown fields and out-of-enum values with an error role, and the lexer never raises on half-typed input.

django-admin-search-query: Structured search in the changelist (#1)

SearchQueryAdminMixin teaches the admin search box the query language: drop it before ModelAdmin and the changelist accepts field-scoped, boolean, and phrase queries. Anything it can’t parse – including a plain word – falls back to Django’s built-in search_fields, so the box never behaves worse than stock admin.

django-admin-search-query: Colored, autocompleting search input (#2)

The changelist search box highlights the query as you type – field-scoped terms, phrases, operators, and errors are colored live and entirely client-side, with no per-keystroke request. A keyboard-navigable combobox suggests field names, enum values, and comparison/range operators. With JavaScript off it degrades to the plain search box, so nothing regresses below stock admin.

Development

Automated documentation publishing (#3)

Sphinx docs now build on every pull request, so a broken docs build is caught in review rather than after merge. Merges to master publish the rendered site automatically, keeping the documentation site current without a manual release step.