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

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()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
gwt java。lang.UnsupportedClassVersionError:不受支持的专业。小版本51.0   java XML解析器trycatch不工作   java Jackson MRBean不工作,无法构造实例   javascript是检查参数的更好方法吗?   java在发生冲突时从ArrayList中删除对象   JavaSpringWebFlux和KeyClope JWTRESTAPI   java Selected选项在微调器中不可见   java在增加分区后,有没有办法在ApacheKafka中保持顺序?   java添加SourceRoot会导致spring启动应用程序出错   java Spring引导:任何bean都没有实现ReactiveCrudepository   java无法注册我的自定义AbstractAnnotationConfigDispatcherServletInitializer   TCP连接上的java Caesar密码   java树集排序不正确   java如何在自定义查询中加载@ElementCollection?