Django 6中文教程

15.3 核心功能开发(二):业务数据管理

Django 6 企业级后台管理系统开发(二):业务数据管理与可视化功能详解

Django 6中文教程

本教程详细讲解如何使用Django 6开发企业级后台管理系统的核心功能:业务数据模型定义、批量操作实现、数据筛选与排序、Excel导出功能集成以及基础图表可视化展示,适合新手学习。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

Django 6 企业级后台管理系统开发(二):业务数据管理、批量操作与可视化功能

引言

欢迎回到Django 6企业级后台管理系统系列教程!在第一部分中,我们搭建了基础项目和用户管理功能。今天,我们将深入业务数据管理,涵盖模型定义、批量操作、数据筛选与导出,以及数据可视化展示,这些是企业级系统不可或缺的核心功能。本教程假设您已具备Django基础,如项目创建和模型知识,我将逐步引导您掌握这些高级技能。

1. 业务数据管理概述

在企业级后台管理系统中,业务数据管理是核心,它涉及处理公司运营相关数据,如产品、订单、库存等。Django的模型-视图-模板(MVT)架构非常适合管理这些数据,提供结构化存储和高效查询。

在本部分,我们将以示例业务模型为例,演示如何构建全功能的数据管理模块。

2. 业务数据模型定义

首先,我们需要定义业务相关的Django模型。假设我们正在构建一个电商后台管理系统,包含产品和订单数据。

2.1 创建模型

在您的Django项目中,假设已有应用business(如果未创建,请先运行python manage.py startapp business)。在models.py文件中定义模型。

# business/models.py
from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=100, verbose_name='产品名称')
    description = models.TextField(verbose_name='描述', blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价格')
    stock = models.IntegerField(default=0, verbose_name='库存')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')

    class Meta:
        verbose_name = '产品'
        verbose_name_plural = '产品'

    def __str__(self):
        return self.name

class Order(models.Model):
    order_id = models.CharField(max_length=50, unique=True, verbose_name='订单号')
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name='产品')
    quantity = models.IntegerField(verbose_name='数量')
    total_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='总价')
    order_date = models.DateTimeField(auto_now_add=True, verbose_name='订单日期')
    status = models.CharField(max_length=20, choices=[('pending', '待处理'), ('shipped', '已发货'), ('delivered', '已送达')], default='pending', verbose_name='状态')

    class Meta:
        verbose_name = '订单'
        verbose_name_plural = '订单'

    def __str__(self):
        return self.order_id

运行数据库迁移以创建表:

python manage.py makemigrations business
python manage.py migrate

这个模型定义了产品和订单,使用外键关系,符合实际业务场景。

3. 批量操作实现

批量操作可以提高数据管理效率,例如批量导入、更新或删除。Django管理界面支持批量操作,但我们可以自定义视图来实现更灵活的批量处理。

3.1 使用Django管理界面批量操作

在Django管理界面中,默认有批量删除功能。要启用批量操作,请在admin.py中注册模型并自定义操作。

# business/admin.py
from django.contrib import admin
from .models import Product, Order

class ProductAdmin(admin.ModelAdmin):
    list_display = ['name', 'price', 'stock', 'created_at']
    search_fields = ['name', 'description']
    list_filter = ['created_at']
    actions = ['mark_as_out_of_stock']  # 自定义批量操作

    def mark_as_out_of_stock(self, request, queryset):
        # 批量更新库存为0
        queryset.update(stock=0)
        self.message_user(request, f"{queryset.count()}个产品已标记为缺货")
    mark_as_out_of_stock.short_description = '标记为缺货'

admin.site.register(Product, ProductAdmin)
admin.site.register(Order)

3.2 自定义批量导入视图

对于从Excel或CSV批量导入数据,可以创建视图处理文件上传。使用pandas库读取数据。

首先,安装pandas:

pip install pandas

然后创建视图函数:

# business/views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
import pandas as pd
from .models import Product

@login_required
def import_products(request):
    if request.method == 'POST' and request.FILES.get('csv_file'):
        csv_file = request.FILES['csv_file']
        # 使用pandas读取CSV文件
        df = pd.read_csv(csv_file)
        products = []
        for index, row in df.iterrows():
            product = Product(
                name=row['name'],
                description=row.get('description', ''),
                price=row['price'],
                stock=row['stock']
            )
            products.append(product)
        # 批量插入数据
        Product.objects.bulk_create(products)
        return redirect('product_list')  # 假设有一个产品列表视图
    return render(request, 'business/import.html')

在模板中创建上传表单,简化操作。

4. 数据筛选、排序与Excel导出功能

企业级系统需要强大的数据查询和导出能力。我们将结合Django QuerySet和openpyxl库来实现。

4.1 数据筛选与排序

使用Django的filter()order_by()方法。在视图中处理请求参数。

# business/views.py
from django.shortcuts import render
from .models import Product, Order
from django.core.paginator import Paginator

def product_list(request):
    products = Product.objects.all()
    
    # 筛选:根据查询参数动态过滤
    name_query = request.GET.get('name', '')
    if name_query:
        products = products.filter(name__icontains=name_query)
    
    # 排序:根据参数排序
    sort_by = request.GET.get('sort_by', 'created_at')
    order = request.GET.get('order', 'desc')
    if sort_by in ['name', 'price', 'stock', 'created_at']:
        if order == 'asc':
            products = products.order_by(sort_by)
        else:
            products = products.order_by('-' + sort_by)
    
    # 分页
    paginator = Paginator(products, 10)  # 每页10个
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    
    context = {
        'products': page_obj,
        'page_obj': page_obj,
    }
    return render(request, 'business/product_list.html', context)

4.2 Excel导出功能

使用openpyxl库导出数据为Excel文件。

首先安装openpyxl:

pip install openpyxl

创建导出视图:

# business/views.py
from django.http import HttpResponse
from openpyxl import Workbook

def export_products(request):
    products = Product.objects.all()
    
    # 创建Excel工作簿
    wb = Workbook()
    ws = wb.active
    ws.title = "Products"
    
    # 写入表头
    headers = ['ID', 'Name', 'Description', 'Price', 'Stock', 'Created At']
    for col_num, header in enumerate(headers, 1):
        ws.cell(row=1, column=col_num, value=header)
    
    # 写入数据
    for row_num, product in enumerate(products, 2):
        ws.cell(row=row_num, column=1, value=product.id)
        ws.cell(row=row_num, column=2, value=product.name)
        ws.cell(row=row_num, column=3, value=product.description)
        ws.cell(row=row_num, column=4, value=float(product.price))
        ws.cell(row=row_num, column=5, value=product.stock)
        ws.cell(row=row_num, column=6, value=product.created_at.strftime('%Y-%m-%d %H:%M:%S'))
    
    # 返回Excel文件响应
    response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    response['Content-Disposition'] = 'attachment; filename="products.xlsx"'
    wb.save(response)
    return response

在模板中添加导出按钮链接到此视图。

5. 数据可视化展示(基础图表集成)

数据可视化有助于分析趋势,我们将集成Chart.js作为基础图表库。

5.1 前端集成Chart.js

在模板中引入Chart.js,并从Django视图获取数据。

首先,在视图函数中提供JSON数据API:

# business/views.py
from django.http import JsonResponse

def product_chart_data(request):
    products = Product.objects.all()
    data = {
        'labels': [product.name for product in products],
        'datasets': [{
            'label': 'Stock',
            'data': [product.stock for product in products],
            'backgroundColor': 'rgba(54, 162, 235, 0.2)',
            'borderColor': 'rgba(54, 162, 235, 1)',
        }]
    }
    return JsonResponse(data)

在模板中,使用JavaScript和Chart.js渲染图表:

<!-- business/chart.html -->
<!DOCTYPE html>
<html>
<head>
    <title>产品库存图表</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
    <h1>产品库存可视化</h1>
    <canvas id="productChart" width="400" height="200"></canvas>
    <script>
        fetch('/chart-data/')  // 替换为您的URL
            .then(response => response.json())
            .then(data => {
                const ctx = document.getElementById('productChart').getContext('2d');
                new Chart(ctx, {
                    type: 'bar',
                    data: data,
                    options: {
                        responsive: true,
                        scales: {
                            y: {
                                beginAtZero: true
                            }
                        }
                    }
                });
            });
    </script>
</body>
</html>

5.2 优化与扩展

您可以根据需求添加更多图表类型,如折线图或饼图。确保视图提供适当的数据格式。

6. 总结

通过本教程,您已学会在Django 6中实现企业级后台管理系统的核心业务数据功能:

  • 模型定义:创建结构化业务数据模型。
  • 批量操作:使用Django管理界面和自定义视图进行批量处理。
  • 数据筛选与排序:利用QuerySet实现动态查询。
  • Excel导出:集成openpyxl导出数据为Excel文件。
  • 数据可视化:集成Chart.js展示基础图表。

这些功能组合起来,能构建强大、高效的后台管理系统。实践是最好的学习方式,尝试自定义模型和扩展功能。下个部分,我们将探讨用户权限管理和高级日志记录。

Happy coding!

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包