Параметры отчетов Django

Я хочу создать новое приложение «Бизнес», используя структуру Django. Любые предложения относительно того, что я могу использовать в качестве структуры отчетности? Приложение должно будет генерировать отчеты по различным бизнес-сущностям, включая сводки, итоги, группировку и т. д. По сути, существует ли аналог отчетов Crystal для Django/Python?


person yuben    schedule 06.07.2009    source источник
comment
см. stackoverflow.com/q/8238975/302521 для ответа на вопрос об использовании BIRT с Django. Возможно, это не то, что вы ищете, но мы сделали так, чтобы это работало для причудливых отформатированных отчетов.   -  person Philippe Ombredanne    schedule 23.11.2011
comment
Я использую POD: stackoverflow.com/questions/ 16943597/   -  person dani herrera    schedule 07.06.2013


Ответы (5)


На djangopackages.com есть сетка, которая может быть полезна для оценки параметров:

https://www.djangopackages.com/grids/g/reporting/

person Daniel Naab    schedule 06.07.2009
comment
Вы должны сказать, что это альфа, имеет две открытые ошибки и активность проекта меньше, чем вы могли ожидать. - person sorin; 03.11.2009
comment
Сейчас май 2014 года, и этот репозиторий кода не обновлялся с декабря 2009 года. - person lsh; 10.05.2014

Я сделал django-report-builder. Он позволяет создавать запросы ORM с помощью графического интерфейса и создавать отчеты в виде электронных таблиц. Он не может создавать шаблоны, хотя было бы неплохо добавить эту функцию.

person Bufke    schedule 16.10.2013
comment
Я надеюсь, что когда-нибудь вы сможете заставить его работать с Django 1.10 и последней версией Django Rest Framework. Похоже, такой полезный инструмент! - person Bobort; 26.10.2016
comment
Откройте отчет об ошибке, если последняя версия DRF вызывает проблемы. Django 1.10 — известная проблема, и в настоящее время она частично поддерживается. - person Bufke; 27.10.2016
comment
@Bufke У меня уже есть готовые запросы с фильтрами (с использованием django_filters). Мне просто нужно добавить кнопку для загрузки. Можно ли добавить только возможность загрузки в мой набор фильтров? - person Arindam Roychowdhury; 17.10.2018

Это просто шаблоны HTML с обычными функциями просмотра.

Это не требует многого: параметры поступают из формы; напишите запрос в функции просмотра, передав набор запросов в шаблон. Шаблон представляет отчет.

Зачем вам нужно что-то большее, чем это?

Вы можете использовать общий список/детальные представления чтобы избавить себя от необходимости писать столько кода. Если вы идете по этому пути, вы предоставляете набор запросов и шаблон общему представлению, которое выполняет часть обработки за вас.

Поскольку вы должны написать запрос в отчетах Crystal или Django, вы не получите много преимуществ от инструмента «отчетности».

person S.Lott    schedule 06.07.2009
comment
С хорошей структурой отчетности вы получаете несколько представлений отображения и сортировку, а необходимость в создании шаблонов отпадает. - person Daniel Naab; 07.07.2009
comment
@Daniel: с хорошей структурой отчетности ... Хорошее настроение. Любые примеры или предложения? Вы можете очень быстро написать общий шаблон для простых столбчатых отчетов. Не уверен, что вижу, что может сделать инструмент отчетности лучше, чем просто делать очевидное в Django. - person S.Lott; 07.07.2009
comment
@S.Lott, структуры отчетности полезны, когда вам нужно больше, чем простая плоская таблица данных. например, newforms довольно хорош, но это не делает интерфейс администратора излишним. - person Daniel Naab; 07.07.2009

Основываясь на предложении @s-lott, вы можете добавлять отчеты на сайт администратора, используя прокси-модель, класс администратора модели с пользовательским changelist_view() и настраиваемым шаблоном, производным от admin/base_site.html.

Предполагая, что Django v2.1 (для разрешений на просмотр модели) и классический домен клиентов, продуктов и продаж, вот полный пример:

  1. Создайте прокси-модель для отображения отчета на странице индекса администратора:
    class SalesReport(SalesOrder):
        class Meta:
            proxy = True
    
  2. Создайте класс администратора модели для модели:
    @admin.register(SalesReport)
    class SalesReportAdmin(admin.ModelAdmin):
        ...
    
  3. Реализовать представление отчета:
    def sales_report(self, request):
        monthly_products_by_customer_sql = '''
        SELECT c.name AS customer,
               p.name AS product,
               COUNT(DISTINCT o.id) AS total_orders,
               SUM(oi.quantity) AS total_products,
               SUM(oi.quantity * oi.price) AS total_amount
        FROM sales_salesorder o
        INNER JOIN customers_customer c ON o.customer_id = c.id
        INNER JOIN sales_salesorderitem oi ON o.id = oi.sales_order_id
        INNER JOIN products_product p ON oi.product_id = p.id
        WHERE o.departure_date >= %s AND o.departure_date <= %s
        GROUP BY c.id, p.id
        ORDER BY total_amount DESC;
        '''
        start, end = get_previous_month_start_end_date()
        with connection.cursor() as cursor:
            cursor.execute(monthly_products_by_customer_sql, (start, end))
            results = namedtuplefetchall(cursor)
            totals = Totals(
                total_orders=sum(r.total_orders for r in results),
                total_products=sum(r.total_products for r in results),
                total_amount=sum(r.total_amount for r in results),
            )
            context = dict(
                self.admin_site.each_context(request),
                title=f'Sales report for {start} - {end}',
                period_start=start,
                period_end=end,
                results=results,
                totals=totals,
            )
            return TemplateResponse(request, 'sales/report.html', context)
    
  4. Вернуть представление отчета из changelist_view(), завернув его в admin_site.admin_view() для защиты от несанкционированного доступа
    def changelist_view(self, request):
        return self.admin_site.admin_view(self.sales_report)(request)
    
  5. Удалите разрешения на добавление, изменение и удаление, чтобы осталось только разрешение на просмотр, и защитите представления изменений и истории:

    def has_add_permission(self, request):
        return False
    
    def has_change_permission(self, request, obj=None):
        return False
    
    def has_delete_permission(self, request, obj=None):
        return False
    
    def change_view(self, *args, **kwargs):
        raise PermissionDenied
    
    def history_view(self, *args, **kwargs):
        raise PermissionDenied
    
  6. Помощники и импорт для представления sales_report():

    from collections import namedtuple
    from django.core.exceptions import PermissionDenied    
    from django.db import connection
    from django.template.response import TemplateResponse
    
    Totals = namedtuple('Totals', ['total_orders', 'total_products', 'total_amount'])
    
    def namedtuplefetchall(cursor):
        '''Return all rows from a cursor as a namedtuple'''
        desc = cursor.description
        nt_result = namedtuple('Result', [col[0] for col in desc])
        return [nt_result(*row) for row in cursor.fetchall()]
    
    def get_previous_month_start_end_date():
        today = datetime.date.today()
        prev_month_last = datetime.date(today.year, today.month, 1) - datetime.timedelta(1)
        prev_month_first = datetime.date(prev_month_last.year, prev_month_last.month, 1)
        return prev_month_first, prev_month_last
    
  7. Добавьте следующий шаблон в sales/report.html, производный от admin/base_site.html, чтобы использовать макет администратора:
    {% extends "admin/base_site.html" %}
    {% block content %}
    <div id="content-main"><div class="results">
      <table>
        <thead>
          <tr>
            <th scope="col"><div class="text">Customer</div></th>
            <th scope="col"><div class="text">Product</div></th>
            <th scope="col"><div class="text"># orders</div></th>
            <th scope="col"><div class="text"># products</div></th>
            <th scope="col"><div class="text">Amount €</div></th>
          </tr>
        </thead>
        <tbody>
          {% for result in results %}
          <tr class="row1">
            <td>{{ result.customer }}</td>
            <td>{{ result.product }}</td>
            <td>{{ result.total_orders }}</td>
            <td>{{ result.total_products }}</td>
            <td>{{ result.total_amount|floatformat:2 }}</td>
          </tr>
          {% endfor %}
          <tr class="row1" style="font-weight: bold">
            <td>&nbsp;</td><td>&nbsp;</td>
            <td>{{ totals.total_orders }}</td>
            <td>{{ totals.total_products }}</td>
            <td>{{ totals.total_amount|floatformat:2 }}</td>
          </tr>
        </tbody>
      </table>
    </div></div>
    {% endblock %}
    

Теперь отчет будет отображаться на индексной странице администратора со значком только для просмотра ????, он защищен от несанкционированного доступа и имеет единый вид с остальной частью сайта администратора.

person mrts    schedule 03.03.2019
comment
Отлично! Я надеюсь, что люди заметят это, поскольку оно похоронено в теме 9-летней давности. В SO есть и другие темы, где этот ответ может освещать и других людей. Например, связанные с пользовательскими агрегациями и/или изменениями в шаблоне администратора change_list.html. - person BringBackCommodore64; 14.05.2019
comment
Спасибо :)! Я могу помочь и в других темах, но мне нужна ваша помощь в их поиске. - person mrts; 14.05.2019
comment
О, парень. Я прочитал тонны из них. Но я не помню, как их найти. Это единственное, что мне приходит в голову на данный момент › stackoverflow.com/search?q=%22change_list_template%22< /а> - person BringBackCommodore64; 14.05.2019

Изменить Похоже, что оба пакета исчезли, но теперь у нас есть хорошая структура данных, заимствованная из R -- DataFrame в пакете pandas Краткий туториал (обратите внимание на раздел "Группировка")


Я не знаю о полном решении для создания отчетов для Django (или Python), но создавать отчеты с помощью Django довольно просто с ORM или без него:

  • django-tables может дать вам очень простую структуру для обработки данных таблицы (сортировка на стороне сервера по возрастанию/убыванию и т.д.)
  • вы можете использовать стандартные агрегаты набора запросов django 1.1 (их использует django-reporting) для итоговых/промежуточных итогов.

Лично я использую django-tables и пакет python datashaping для быстрой сводки/avg/median/IQR/ материал для фильтрации, потому что у меня есть много разных источников данных (данные REST, две базы данных mysql, файлы csv из R), и лишь немногие из них сейчас находятся в базе данных django.

Pycha — один из кандидатов для рисования простых диаграмм.

Мне не нравятся сетки на основе ajax на стороне клиента и т. д. для отчетов, но вы также можете использовать его с шаблонами django.

person zzr    schedule 07.07.2009
comment
разработка django-tables, похоже, продолжается на github.com/bradleyayers/django-tables с документация на readthedocs.org/docs/django-tables/en/latest . Последний выпуск PyPI pypi.python.org/pypi/django-tables/0.1 от оригинального автора от июля 2008 года. - person akaihola; 02.03.2011
comment
оба django tables и datashaping больше не существуют - все репозитории и страницы документов дают 404s - person lsh; 10.05.2014
comment
Да вроде пропали. Вероятно, в наши дни можно было бы использовать структуры DataFrame из панд (см. краткое описание здесь: gregreda.com/2013/10/26/working-with-pandas-dataframes), особенно раздел "Группировка" - person zzr; 10.05.2014