Статьи Анализ данных 14 мин

Визуализация данных через шаблоны Admin

person
Редакция Django-Admin.ru
Редакция • Опубликовано 28 сентября 2024 г.
Анализ данных Pandas Matplotlib Шаблоны Admin

Django Admin создан для CRUD. Но в data-heavy организациях люди, которым нужно видеть данные, часто те же, кто управляет ими через админку. Вместо отдельного аналитического дашборда можно встроить визуализации прямо в рабочий процесс.

Подход 1: SVG-графики через Matplotlib

Генерируем графики на сервере и встраиваем как SVG:

import io
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

class SalesReportAdmin(admin.ModelAdmin):
    change_list_template = 'admin/sales_report.html'

    def changelist_view(self, request, extra_context=None):
        fig, ax = plt.subplots(figsize=(10, 4))
        data = self.get_monthly_sales()
        ax.bar(data['months'], data['revenue'], color='#092E20')
        ax.set_title('Выручка по месяцам')

        buf = io.BytesIO()
        fig.savefig(buf, format='svg', bbox_inches='tight')
        chart_svg = buf.getvalue().decode('utf-8')
        plt.close(fig)

        extra_context = extra_context or {}
        extra_context['chart_svg'] = chart_svg
        return super().changelist_view(request, extra_context=extra_context)

Подход 2: Pandas DataFrame как HTML-таблица

def get_summary_table(self):
    df = pd.DataFrame(
        Order.objects.values('status')
        .annotate(count=Count('id'), total=Sum('amount'))
    )
    return df.to_html(classes='table', index=False)

Рекомендации по производительности

  • Кешируйте агрессивно — используйте @method_decorator(cache_page(300))
  • Ограничивайте диапазон — по умолчанию последние 30 дней
  • Ленивая загрузка — для тяжёлых графиков используйте AJAX
  • Управление памятью — всегда закрывайте фигуры: plt.close()

Когда остановиться

Если вы строите более 3–4 кастомных view с графиками — пора подключать полноценный BI-инструмент (Metabase, Redash). Admin — для оперативного управления данными, а не для аналитики.

forum Обсуждение

Комментарии скоро будут доступны. Следите за обновлениями!