Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django报告选项_Python_Django_Reporting - Fatal编程技术网

Python Django报告选项

Python Django报告选项,python,django,reporting,Python,Django,Reporting,我想使用Django框架创建一个新的“业务”应用程序。关于我可以使用什么作为报告框架,有什么建议吗?应用程序将需要生成各种业务实体的报告,包括摘要、汇总、分组等。基本上,是否有类似Django/Python的水晶报告?这些只是带有普通视图功能的HTML模板 这并不需要太多:参数来自表单;在view函数中编写查询,将查询集传递给模板。模板显示报告 你为什么需要比这更多的东西 您可以使用来避免编写同样多的代码。如果执行此操作,则将查询集和模板提供给一个通用视图,该视图将为您处理一些处理 由于您必须在

我想使用Django框架创建一个新的“业务”应用程序。关于我可以使用什么作为报告框架,有什么建议吗?应用程序将需要生成各种业务实体的报告,包括摘要、汇总、分组等。基本上,是否有类似Django/Python的水晶报告?

这些只是带有普通视图功能的HTML模板

这并不需要太多:参数来自表单;在view函数中编写查询,将查询集传递给模板。模板显示报告

你为什么需要比这更多的东西

您可以使用来避免编写同样多的代码。如果执行此操作,则将查询集和模板提供给一个通用视图,该视图将为您处理一些处理


由于您必须在Crystal reports或Django中编写查询,因此“报告”工具对您的影响不大。

Djangoppackages.com上有一个网格,可用于评估选项:

编辑 看起来这两个包都不见了,但现在我们有了一个很好的数据结构,它是从R中借用过来的 (注意“分组”一节)


我不知道Django(或Python)的完整报告解决方案,但无论是否使用ORM,使用Django进行报告都非常简单:

  • django表可以为处理表数据提供非常基本的结构(asc/desc服务器端排序等)
  • 您可以使用standart django 1.1 queryset聚合(django reporting使用它们)进行汇总/小计
就我个人而言,我使用django表和python包进行快速汇总/avg/media/IQR/过滤,因为我有许多不同的数据源(REST数据、两个mysql数据库、来自R的csv文件),现在django数据库中只有很少的数据源

Pycha是我画简单图表的候选人之一


我不喜欢客户端基于ajax的网格等用于报告,但您也可以将其用于django模板。

。它允许您使用gui构建ORM查询并生成电子表格报告。它不能做模板,但这将是一个很好的添加功能。

基于@s-lott的建议,您可以使用代理模型、带有自定义
changelist\u view()
的模型管理类以及从
admin/base\u site.html
派生的自定义模板向管理站点添加报告

假设Django v2.1(用于模型视图权限)和经典的客户、产品和销售域,下面是一个完整的示例:

  • 创建代理模型以在管理索引页中显示报告:
    class SalesReport(SalesOrder):
        class Meta:
            proxy = True
    
  • 为模型创建模型管理类:
    @admin.register(SalesReport)
    class SalesReportAdmin(admin.ModelAdmin):
        ...
    
  • 实现报告视图:
    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)
    
  • 删除添加、更改、删除权限,以便只保留查看权限,并保护更改和历史视图:

    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
    
  • sales\u 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
    
  • 将以下模板添加到
    sales/report.html
    ,该模板源自
    admin/base\u 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 %}
    
    {%extends“admin/base\u site.html”%}
    {%block content%}
    顾客
    产品
    #命令
    #产品
    金额€
    {结果中的结果为%}
    {{result.customer}}
    {{result.product}
    {{result.total_orders}
    {{result.total_products}
    {{result.total{u amount}floatformat:2}
    {%endfor%}
    {{totals.total_orders}
    {{totals.total_products}}
    {{总计.总计金额{浮动格式:2}
    {%endblock%}
    

  • 现在,该报告将在管理索引页中列出,并带有一个好的报告框架中的“仅查看”图标,您将获得多个显示视图和排序,并且不再需要创建模板。@Daniel:有了一个“好”的报告框架。。。感情真好。有什么例子或建议吗?您可以非常快速地为简单的专栏报告编写通用模板。我不知道有什么比在Django@S.Lott中简单地做显而易见的事情更能让报告工具变得更好。当您需要的不仅仅是一个简单的数据平面表时,报告框架非常有用。例如,newforms很不错,但这并没有使管理界面变得过于复杂。你应该说这是alpha,有两个打开的bug,项目活动比你预期的要少。2014年5月至今,代码回购自2009年12月以来一直没有更新。Django tables的开发似乎正在进行中,文档位于。原始作者最新发布的PyPI版本是2008年7月发布的。
    django表
    datashaping
    似乎不再存在-所有存储库和文档页面都提供404sYeah,看起来它们都不存在了。也许现在人们可以使用pandas的数据帧结构(请参阅此处的简短描述:),尤其是“分组”部分,请参阅以获取将BIRT与Django一起使用的一些答案。这并不是你想要的,但是我们让它可以用于格式奇特的报表。我使用POD:我希望有一天你能让它与Django 1.10和最新版本的Django Rest框架一起使用。它看起来是一个非常有用的工具!如果最新的DRF出现问题,请打开错误报告。Django 1.10是一个已知的问题,目前部分受支持。@Bufke我已经准备好了带过滤器的查询(使用Django_过滤器)。我只需要添加一个下载按钮。是否可以只将下载功能添加到我的过滤器集?这太棒了!我希望人们注意到它,因为它埋在一根9年前的线里。这里还有其他线索,所以这个答案也可以启发其他人。与自定义聚合和/或管理模板更改相关的更改。\u list.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 %}