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

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第三方库


热门话题
具有x86javapath的x64机器上x86java上的java JNI未满足链接错误   java将Pixmap的一部分上传到GPU   图像Java位图RLE8格式   java Android studio谷歌广告崩溃应用程序   java如何创建包含未知数量对象的变量?   Java计算给定int数组的所有可能组合   java JDBC classnotfound异常   httpclient中的java将HttpEntity转换为字符串的最优雅/正确的方法是什么?   如何从Java程序运行nano?   java在安卓中调用自定义类/方法   调用方法和JOptionPane后,允许代码继续执行所需的java计时器或其他想法   关于侦听器的向量Java并发问题   线程池执行器Java线程池   java配置DTO上的Swagger javax验证约束   Java中用于按钮功能的swing操作命令   ServletOutputStream中的java设置状态代码   java打印输入数组的平均值