一个简单的数据库驱动的报告引擎
django-dyn-reports的Python项目详细描述
这个项目的目标是提供一个简单的数据库驱动的报告引擎,输出json和highcharts格式的数据。
海图
模块highcharts具有一些特殊类,用于highcharts预格式化的json输出。下面的例子 演示条形图、组饼图和堆叠条形图。未来将支持更多的highcharts模型。
饼图
类PieChartReportQuery指定了4个需要实现的抽象方法:
get_series_data(self, **kwargs): | |
---|---|
takes any number of keyword parameters and returns an array of data points of the format ^{tt3}$ | |
get_series_name(self, **kwargs): | |
takes any number of keyword parameters and returns and returns a string | |
get_title(self, **kwargs): | |
takes any number of keyword parameters and returns and returns a string | |
get_form(self, **kwargs): | |
takes any number of keyword parameters and returns and returns an array of dictionaries that define the filter form for the report. The specific format depends on the form standard. |
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): | |
---|---|
takes the series name and any number of keyword parameters and returns an array of data points of the values | |
get_series_names(self, **kwargs): | |
takes any number of keyword parameters and returns and returns an array of strings | |
get_x_labels(self, **kwargs): | |
takes any number of keyword parameters and returns an array of strings | |
get_title(self, **kwargs): | |
takes any number of keyword parameters and returns and returns a string | |
get_form(self, **kwargs): | |
takes any number of keyword parameters and returns and returns an array of dictionaries that define the filter form for the report. The specific format depends on the form standard. |
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()