跳转到主要内容

一个简单的数据库驱动报告引擎

项目描述

本项目旨在提供一个简单的数据库驱动报告引擎,输出json和highcharts格式的数据。


Highcharts

模块 highcharts 为highcharts预格式化的json输出提供了一些特殊类。以下示例演示了柱形图、分组饼图和堆叠柱形图。未来将支持更多highcharts模型。

饼图

PieChartReportQuery 定义了需要实现4个抽象方法

get_series_data(self, **kwargs):

接受任意数量的关键字参数,并返回一个数据点数组,格式为 [{"name": "<label>", "y": <value>}

get_series_name(self, **kwargs):

接受任意数量的关键字参数,并返回一个字符串

get_title(self, **kwargs):

接受任意数量的关键字参数,并返回一个字符串

get_form(self, **kwargs):

接受任意数量的关键字参数,并返回一个数组,其中包含定义报告筛选表单的字典。具体格式取决于表单标准。

from django_reports.highcharts import PieChartReportQuery
from my_app.models import Product, Sale, Category
from django.db.models import Count

FIELD_NAMES = {
    "Product": "product__id__in",
    "Category": "category__id__in",
}

class SalesQuery(PieChartReportQuery):

    def get_series_data(self, **kwargs):
        selected_fields = kwargs.get("selected_fields",{})
        selected_fields = {FIELD_NAMES[f]:selected_fields[f] for f in selected_fields.keys() if len(selected_fields[f]) > 0}
        objects = Sale.objects.all()
        if len(selected_fields.keys()) > 0:
            objects = objects.filter(**selected_fields)
        return [{"name": r['product__name'], "y": r['total']} for r in
            objects.values('product__name').annotate(
                total=Count('product__name')).order_by('total')]

    def get_series_name(self, **kwargs):
        return "Sales"

    def get_title(self, **kwargs):
        return "Sales"

    def get_form(self, **kwargs):
        return [
            {"title":"Product", "type": "dropdown", "options": [(r.id, r.name) for r in Product.objects.all()], "selected": []},
            {"title":"Category", "type": "dropdown", "options": [(r.id, r.name) for r in Category.objects.all()], "selected": []},
        ]


query = SalesQuery()

分组和堆叠柱形图

BarChartReportQuery 实现了堆叠和分组柱形图。与饼图相比,接口稍微复杂一些,因为这种图表支持多个系列。因此,数据方法需要提供一个标识符,然后您可以使用它来选择适当的数据。您还需要提供 x 标签和系列名称。以下是需要实现的方法

get_series_data(self, series, **kwargs):

接收系列名称和任意数量的关键字参数,并返回值的数据点数组

get_series_names(self, **kwargs):

接收任意数量的关键字参数,并返回字符串数组

get_x_labels(self, **kwargs):

接收任意数量的关键字参数,并返回字符串数组

get_title(self, **kwargs):

接受任意数量的关键字参数,并返回一个字符串

get_form(self, **kwargs):

接受任意数量的关键字参数,并返回一个数组,其中包含定义报告筛选表单的字典。具体格式取决于表单标准。

from django_reports.highcharts import PieChartReportQuery
from my_app.models import Product, Sale, Category
from django.db.models import Count

FIELD_NAMES = {
    "Product": "product__id__in",
    "Category": "category__id__in",
}

class SalesQuery(PieChartReportQuery):

    def get_series_names(self, series, **kwargs):
        return Category.object.all().values_list("name",flat=True)

    def get_series_data(self, series, **kwargs):
        selected_fields = kwargs.get("selected_fields",{})
        selected_fields = {FIELD_NAMES[f]:selected_fields[f] for f in selected_fields.keys() if len(selected_fields[f]) > 0}
        objects = Sale.objects.filter(category__name=series)
        if len(selected_fields.keys()) > 0:
            objects = objects.filter(**selected_fields)
        return [r['total']} for r in
            objects.values('product__name').annotate(
                total=Count('product__name')).order_by('product__name')]

    def get_x_labels(self, **kwargs):
        return Product.objects.all().order_by('name').values_list("name",flat=True)

    def get_series_name(self, **kwargs):
        return "Sales"

    def get_title(self, **kwargs):
        return "Sales"

    def get_form(self, **kwargs):
        return [
            {"title":"Product", "type": "dropdown", "options": [(r.id, r.name) for r in Product.objects.all()], "selected": []},
            {"title":"Category", "type": "dropdown", "options": [(r.id, r.name) for r in Category.objects.all()], "selected": []},
        ]

query = SalesQuery()

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

django-dyn-reports-0.9.2.tar.gz (9.8 kB 查看散列)

上传时间

构建分布

django_dyn_reports-0.9.2-py2.7.egg (20.6 kB 查看散列)

上传时间