AI-powered natural language search for Django Admin
Project description
Django Admin AI Search
AI-powered natural language search for Django Admin. Ask questions like "Find all users created today" or "Show orders over $1000" and get instant results.
Installation
pip install django-admin-ai-search
Quick Start
1. Add to INSTALLED_APPS
Add django_admin_ai_search before django.contrib.admin:
INSTALLED_APPS = [
"django_admin_ai_search", # Must be before django.contrib.admin
"django.contrib.admin",
# ...
]
2. Add URL patterns
from django.urls import include, path
from django_admin_ai_search.urls import get_urlpatterns as get_ai_search_urls
urlpatterns = [
path("admin/ai-search/", include("django_admin_ai_search.urls")),
path("admin/", admin.site.urls),
# ...
]
# Add search page URLs
urlpatterns += get_ai_search_urls()
3. Configure your LLM generator
Create a generator class that implements the QueryGenerator protocol:
# myapp/generators.py
import json
from openai import OpenAI
from django_admin_ai_search import get_system_prompt
class OpenAIGenerator:
def __init__(self):
self.client = OpenAI() # Uses OPENAI_API_KEY env var
def generate(self, user_query: str, model_schema: list[dict]) -> dict:
response = self.client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": get_system_prompt(model_schema)},
{"role": "user", "content": user_query},
]
)
return json.loads(response.choices[0].message.content)
4. Add settings
DJANGO_ADMIN_AI_SEARCH = {
"GENERATOR": "myapp.generators.OpenAIGenerator",
"CACHE_TIMEOUT": 3600, # Cache results for 1 hour (optional)
"CACHE_PREFIX": "ai_search", # Cache key prefix (optional)
}
Generator Examples
OpenAI
import json
from openai import OpenAI
from django_admin_ai_search import get_system_prompt
class OpenAIGenerator:
def __init__(self, model: str = "gpt-4"):
self.client = OpenAI()
self.model = model
def generate(self, user_query: str, model_schema: list[dict]) -> dict:
response = self.client.chat.completions.create(
model=self.model,
messages=[
{"role": "system", "content": get_system_prompt(model_schema)},
{"role": "user", "content": user_query},
]
)
return json.loads(response.choices[0].message.content)
Anthropic
import json
from anthropic import Anthropic
from django_admin_ai_search import get_system_prompt
class AnthropicGenerator:
def __init__(self, model: str = "claude-sonnet-4-20250514"):
self.client = Anthropic()
self.model = model
def generate(self, user_query: str, model_schema: list[dict]) -> dict:
response = self.client.messages.create(
model=self.model,
max_tokens=1024,
system=get_system_prompt(model_schema),
messages=[{"role": "user", "content": user_query}]
)
return json.loads(response.content[0].text)
AWS Bedrock
import json
import boto3
from django_admin_ai_search import get_system_prompt
class BedrockGenerator:
def __init__(self, model_id: str = "anthropic.claude-3-sonnet-20240229-v1:0"):
self.client = boto3.client("bedrock-runtime")
self.model_id = model_id
def generate(self, user_query: str, model_schema: list[dict]) -> dict:
response = self.client.converse(
modelId=self.model_id,
system=[{"text": get_system_prompt(model_schema)}],
messages=[{"role": "user", "content": [{"text": user_query}]}]
)
return json.loads(response["output"]["message"]["content"][0]["text"])
LangChain
import json
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from django_admin_ai_search import get_system_prompt
class LangChainGenerator:
def __init__(self):
self.llm = ChatOpenAI(model="gpt-4", temperature=0)
def generate(self, user_query: str, model_schema: list[dict]) -> dict:
prompt = ChatPromptTemplate.from_messages([
("system", get_system_prompt(model_schema)),
("human", "{query}"),
])
chain = prompt | self.llm
response = chain.invoke({"query": user_query})
return json.loads(response.content)
Pydantic-AI
from pydantic import BaseModel
from pydantic_ai import Agent
from django_admin_ai_search import get_system_prompt
class QueryResult(BaseModel):
code: str
explanation: str
app_label: str
model_name: str
class PydanticAIGenerator:
def __init__(self):
self.agent = Agent("openai:gpt-4", result_type=QueryResult)
def generate(self, user_query: str, model_schema: list[dict]) -> dict:
result = self.agent.run_sync(
user_query,
system_prompt=get_system_prompt(model_schema)
)
return result.data.model_dump()
Configuration Options
DJANGO_ADMIN_AI_SEARCH = {
# Required: Your generator class or instance
"GENERATOR": "myapp.generators.OpenAIGenerator",
# Optional: Cache timeout in seconds (default: 3600)
"CACHE_TIMEOUT": 3600,
# Optional: Cache key prefix (default: "django_admin_ai_search")
"CACHE_PREFIX": "django_admin_ai_search",
}
How It Works
- User enters a natural language query in the Django admin search box
- The package extracts schema information from all registered admin models
- Your generator receives the query and schema, calls your LLM, and returns structured JSON
- The package executes the generated Django ORM code safely
- Results are displayed in a dynamic table with clickable links to admin change pages
Security
- Only read-only queries are allowed (no UPDATE, DELETE, CREATE, etc.)
- Queries are limited to 50 results
- Only models registered in Django admin are queryable
- Staff authentication required for all endpoints
Development
# Clone the repository
git clone https://github.com/quanhea/django-admin-ai-search.git
cd django-admin-ai-search
# Install dependencies with uv
uv sync
# Run tests
uv run pytest
# Build package
uv build
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_admin_ai_search-0.1.0.tar.gz.
File metadata
- Download URL: django_admin_ai_search-0.1.0.tar.gz
- Upload date:
- Size: 13.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d5f624f6861add9129788bd5f3326527465cb3535ae358b9a7cfa2d9f8bc6d4d
|
|
| MD5 |
26fc0d32a19b199199b003d2591ccdc3
|
|
| BLAKE2b-256 |
d0184b9204de5d2f7f43278d95d8ede31ab364269cb021fe1a0c97f4d1c7f07a
|
Provenance
The following attestation bundles were made for django_admin_ai_search-0.1.0.tar.gz:
Publisher:
release.yml on quanhea/django-admin-ai-search
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_admin_ai_search-0.1.0.tar.gz -
Subject digest:
d5f624f6861add9129788bd5f3326527465cb3535ae358b9a7cfa2d9f8bc6d4d - Sigstore transparency entry: 770719789
- Sigstore integration time:
-
Permalink:
quanhea/django-admin-ai-search@580eeb4869f36ec3686f40d510b859eeaafc3cdf -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/quanhea
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@580eeb4869f36ec3686f40d510b859eeaafc3cdf -
Trigger Event:
push
-
Statement type:
File details
Details for the file django_admin_ai_search-0.1.0-py3-none-any.whl.
File metadata
- Download URL: django_admin_ai_search-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7725136963098801b780135426f57a14fa63d72c0941624768f4dafe35f9b0ac
|
|
| MD5 |
e93506878d613ade5b65f33e0548fd3c
|
|
| BLAKE2b-256 |
d1047325457cc697a9131a5d11f7cacfd685bef649f315c4f9df7d43f93250db
|
Provenance
The following attestation bundles were made for django_admin_ai_search-0.1.0-py3-none-any.whl:
Publisher:
release.yml on quanhea/django-admin-ai-search
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_admin_ai_search-0.1.0-py3-none-any.whl -
Subject digest:
7725136963098801b780135426f57a14fa63d72c0941624768f4dafe35f9b0ac - Sigstore transparency entry: 770719790
- Sigstore integration time:
-
Permalink:
quanhea/django-admin-ai-search@580eeb4869f36ec3686f40d510b859eeaafc3cdf -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/quanhea
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@580eeb4869f36ec3686f40d510b859eeaafc3cdf -
Trigger Event:
push
-
Statement type: