A Django app that extends the admin interface with group-by functionality
Project description
Django Admin Group-By
Django Admin Group-By adds SQL-style GROUP BY functionality to the Django admin, letting you easily group and summarize data with aggregations like counts, sums, and averages directly in the admin interface.
It works by adding a "Group by" filter in the admin sidebar, allowing you to select fields and instantly see summarized views of your data.
Key Features
- Group Data Directly in Admin: Easily group by model fields to quickly identify patterns.
- Built-in Aggregations: Perform counts, sums, averages and more including advanced custom aggregations.
- Custom Calculations: Aggregate calculated fields with lambda functions that run after database queries.
- Compatible: Integrates seamlessly with Django admin filters, search, and permissions.
- Efficient: Performs aggregations server-side, suitable for large datasets.
Installation
pip install django-admin-groupby
Add the app to your INSTALLED_APPS in settings.py:
INSTALLED_APPS = [
# ...
'django.contrib.admin',
# ...
'django_admin_groupby', # Add this line
]
Example Usage
Here's an example demonstrating both basic grouping and advanced aggregations:
from django.contrib import admin
from django.db.models import Count, Sum, Avg, Q
from django_admin_groupby.admin import GroupByAdminMixin
from django_admin_groupby import PostProcess
from .models import Product
@admin.register(Product)
class ProductAdmin(GroupByAdminMixin, admin.ModelAdmin):
# ...
group_by_fields = ['category', 'in_stock']
# (optional, defaults to just counts if nothing is specified)
group_by_aggregates = {
'id': {
'count': Count('id', extra={'verbose_name': "Total Products"}),
'in_stock_count': Count('id', filter=Q(in_stock=True),
extra={'verbose_name': "In-Stock Products"}),
},
'price': {
'avg': Avg('price', extra={'verbose_name': "Average Price"}),
'sum': Sum('price', extra={'verbose_name': "Total Value"}),
'expensive_items': Count('id', filter=Q(price__gte=100),
extra={'verbose_name': "Expensive Items (>= $100)"}),
},
'profit_margin': {
'total': PostProcess(
lambda product: product.price - product.cost,
verbose_name="Profit Margin",
aggregate="avg"
)
}
}
Demo
A demo project is included in the repository to illustrate usage:
git clone https://github.com/numegil/django-admin-groupby.git
cd django-admin-groupby
# (optional)
python -m venv venv
source venv/bin/activate
pip install -e .
cd example
python manage.py migrate
python manage.py generate_cats --count 100
python manage.py createsuperuser
python manage.py runserver
Access the demo at http://localhost:8000/admin/cats/cat/.
License
MIT License. Feel free to use and modify this code.
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_groupby-1.0.1.tar.gz.
File metadata
- Download URL: django_admin_groupby-1.0.1.tar.gz
- Upload date:
- Size: 12.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
935984cf9ea3749b895196d8dfe042a48510553c8eafa1b04d4019b875df2b6c
|
|
| MD5 |
20e6b47c0b7b2fd20fd8aa016164ed13
|
|
| BLAKE2b-256 |
3ef86244674c42cc76041e43106c528dfa6eb518c764d541096a5a867701f6cc
|
File details
Details for the file django_admin_groupby-1.0.1-py3-none-any.whl.
File metadata
- Download URL: django_admin_groupby-1.0.1-py3-none-any.whl
- Upload date:
- Size: 12.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a08f96c6ac45072fdd808c17924549f9c6e8848122f8114c2c2a89850ff83095
|
|
| MD5 |
659bb8fad9e75edfd2aeb1b77b94c8b3
|
|
| BLAKE2b-256 |
fd9d7d8eda293439882d8a2761c1fec00076888d82994019a69b9715f6dd622e
|