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