一个简单的数据库驱动报告引擎
项目描述
本项目旨在提供一个简单的数据库驱动报告引擎,输出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 查看散列)
关闭
django-dyn-reports-0.9.2.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | d25d5afc7fde14f00b1a11aed69bc854a3bcf369d7331ff438acc4f112a8c03d |
|
MD5 | eaeafe461865d205f72bad464953b0af |
|
BLAKE2b-256 | 2470c3da3eca02034471c2a43be37ad24900fba7c32fe9082c15e79ad519248d |
关闭
django_dyn_reports-0.9.2-py2.7.egg 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 9f48f47dd7c7f78454937194d36a72c7f10505318a4b3c79a052e22ba3d20aa1 |
|
MD5 | e47a6676d9246069960952fa3cbea6bc |
|
BLAKE2b-256 | f34e78d403a286fd4a67d41262037e3e2365d51f258ba761c0328d74e90225b9 |