Django+MySQL网购数据可视化分析系统开发实战教程

📅 2026/8/27 6:46:35
Django+MySQL网购数据可视化分析系统开发实战教程
又到了课设、毕设集中开工的时间段很多同学都在纠结选题既要技术栈常见、资料好找又要功能清晰、能写出东西最好还能直接跑通、改一改就能交。如果你正在找这类项目那基于Django MySQL 的网购数据可视化分析系统是一个很稳的选择。这套系统在课程设计和毕业设计里出现频率很高核心思路并不复杂先做出网购数据的增删改查再通过图表把统计结果展示出来。本文会从环境准备、数据库设计、核心代码到运行演示完整拆解即使你之前只写过 Python 基础代码也能一步步复现。项目源码可以继续在文末按说明获取改改项目名称、换换数据集就能变成一份自己的课设作品。1. 项目背景与核心概念1.1 什么是网购数据可视化分析系统网购数据可视化分析系统简单说就是把电商业务中产生的订单、商品、用户、销售额等数据存到数据库里然后通过 Web 页面展示统计分析结果。这类系统通常包含两个层面数据管理层面对商品信息、订单记录、用户信息进行维护包括新增、修改、删除、查询。数据可视化层面对数据库中的记录做聚合统计例如统计每月的销售额、各分类的商品数量、不同地区的订单分布然后用折线图、柱状图、饼图展示出来。从技术角度看Django 负责业务逻辑和页面渲染MySQL 负责数据存储ECharts 负责图表绘制。三者结合后系统能做到“录入数据 - 保存到 MySQL - 页面读取数据库 - 生成可视化图表”的完整闭环。1.2 为什么选择 Django 和 MySQLDjango 的优势Django 是一个重量级的 Python Web 框架内置了 ORM、Admin 后台、模板引擎、表单处理等能力。对课设和毕设来说Django 最大的好处是“自带后台管理系统”只要定义好数据模型Django Admin 会自动生成一套可用的增删改查界面省去大量重复的前端开发工作。另外Django 的 ORM 让开发者不用写原生 SQL 就能完成大部分数据库操作这让代码的可读性和维护性都更好。MySQL 的优势MySQL 是使用最广泛的关系型数据库之一在课程设计、毕业设计、企业开发中都很常见。网上关于 MySQL 的安装教程、问题排查资料非常多遇到报错基本都能找到解决方案。Django 对 MySQL 的支持也非常成熟通过mysqlclient或pymysql驱动即可连接。可视化部分可视化可以选用 ECharts 或 Chart.js。ECharts 在国内项目中使用更普遍中文文档完善图表类型丰富做课设演示时视觉效果比较好。1.3 系统适合的人群与应用场景课程设计适合 Python 方向课程、Web 开发课程、数据库课程。毕业设计适合计算机科学、软件工程、信息管理、电子商务等专业。学习练手适合想系统学习 Django MySQL 前后端数据交互的开发者。这个项目的代码量适中既不像纯登录注册那样单薄也不像大型电商平台那样复杂用来做课设或毕设的“骨架”非常合适。2. 环境准备与版本说明2.1 运行环境要求本项目的运行环境可以归纳如下环境项建议要求操作系统Windows 10/11、macOS、Ubuntu 均可Python 版本Python 3.8 及以上Django 版本本项目以 Django 3.x/4.x 为例3.2 LTS 版本更稳MySQL 版本MySQL 5.7 或 8.0MySQL 驱动mysqlclient 或 pymysql前端可视化库ECharts通过 CDN 引入即可IDEPyCharm 或 VS Code这里特别说明一下Django 版本迭代比较快不同版本之间的配置方式有小差异。本文的代码和配置在 Django 3.2 / 4.x 下都能运行如果你用的是 Django 5.x需要注意urls.py的写法变化。2.2 创建虚拟环境并安装 Django为了不让项目依赖与系统全局 Python 环境冲突建议先创建虚拟环境。在项目目录下打开终端Windows 使用 CMD 或 PowerShellmacOS/Linux 使用 Terminal# 创建虚拟环境 python -m venv venv # Windows 激活虚拟环境 venv\Scripts\activate # macOS/Linux 激活虚拟环境 source venv/bin/activate激活后命令行前面会出现(venv)标识。接着安装 Django 和 MySQL 驱动。以 Django 3.2 为例可以指定版本安装pip install django3.2.25 pip install mysqlclient如果你的环境安装mysqlclient失败比如在 Windows 上缺少编译环境可以改用pymysqlpip install pymysql使用pymysql时需要在项目的__init__.py文件中加入以下代码import pymysql pymysql.install_as_MySQLdb()2.3 创建 Django 项目和 App虚拟环境准备就绪后先创建项目和应用。假设项目名为online_shopping_analysis应用名为analysisdjango-admin startproject online_shopping_analysis cd online_shopping_analysis python manage.py startapp analysis创建完成后项目目录结构如下online_shopping_analysis/ ├── manage.py ├── online_shopping_analysis/ │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── analysis/ ├── __init__.py ├── admin.py ├── apps.py ├── models.py ├── views.py ├── migrations/ └── tests.py2.4 准备 MySQL 数据库打开 MySQL执行下面的 SQL 语句创建数据库CREATE DATABASE shopping_analysis CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;使用utf8mb4字符集很重要它可以完整支持中文和特殊符号避免页面出现乱码。需要注意的是数据库的用户名和密码要记住后面配置 Django 连接时会用到。3. 系统整体设计3.1 功能模块划分网购数据可视化分析系统可以拆分成以下几个功能模块功能模块说明用户管理模块登录、注册、退出可选商品管理模块商品分类、商品信息维护订单管理模块订单记录的新增、查询、删除数据统计模块销售额统计、订单量统计、商品分类占比可视化展示模块柱状图、折线图、饼图展示统计结果对于课设和毕设来说建议优先保证商品管理、订单管理、数据统计和可视化展示这四个模块登录注册可以作为加分项。3.2 数据库表结构设计本项目可以设计以下三张核心数据表。商品分类表 category字段名类型说明idint主键自增namevarchar(50)分类名称create_timedatetime创建时间商品表 product字段名类型说明idint主键自增namevarchar(100)商品名称categoryint外键关联分类表pricedecimal(10,2)商品单价stockint库存数量salesint销量create_timedatetime创建时间订单表 order_info字段名类型说明idint主键自增order_novarchar(50)订单编号productint外键关联商品表quantityint购买数量total_pricedecimal(10,2)订单总金额statusvarchar(20)订单状态order_datedate下单日期create_timedatetime创建时间3.3 项目目录结构说明在实际开发中建议把数据可视化相关代码放到analysis应用内模板文件放在templates目录下静态文件放在static目录下。完整结构如下online_shopping_analysis/ ├── manage.py ├── online_shopping_analysis/ │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── analysis/ │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── models.py │ ├── views.py │ ├── tests.py │ └── migrations/ ├── templates/ │ ├── base.html │ ├── index.html │ ├── product_list.html │ └── chart.html └── static/ ├── css/ ├── js/ └── images/之所以单独建立templates和static目录是为了让模板文件、静态资源与业务代码分离后续维护和修改页面会方便很多。4. 数据库配置与数据模型实现4.1 Django 连接 MySQL 配置打开online_shopping_analysis/settings.py找到DATABASES配置项修改为 MySQL 连接信息# 文件路径online_shopping_analysis/settings.py DATABASES { default: { ENGINE: django.db.backends.mysql, NAME: shopping_analysis, USER: root, PASSWORD: 你的数据库密码, HOST: 127.0.0.1, PORT: 3306, OPTIONS: { charset: utf8mb4, }, } }这里有几个容易出错的地方NAME是数据库名称必须先在 MySQL 中创建好。USER和PASSWORD要替换成自己的 MySQL 账号密码。HOST默认填127.0.0.1如果 MySQL 部署在其他机器要改成对应 IP。PORT默认是3306如果你的 MySQL 端口被修改过要同步修改。同时在settings.py中注册应用并配置模板目录# 文件路径online_shopping_analysis/settings.py INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, analysis, ] TEMPLATES [ { BACKEND: django.template.backends.django.DjangoTemplates, DIRS: [BASE_DIR / templates], APP_DIRS: True, OPTIONS: { context_processors: [ django.template.context_processors.debug, django.template.context_processors.request, django.contrib.auth.context_processors.auth, django.contrib.messages.context_processors.messages, ], }, }, ]如果使用pymysql驱动还要在online_shopping_analysis/__init__.py中加入import pymysql pymysql.install_as_MySQLdb()4.2 编写数据模型打开analysis/models.py添加以下模型定义# 文件路径analysis/models.py from django.db import models class Category(models.Model): 商品分类表 name models.CharField(max_length50, verbose_name分类名称) create_time models.DateTimeField(auto_now_addTrue, verbose_name创建时间) class Meta: verbose_name 商品分类 verbose_name_plural verbose_name db_table category def __str__(self): return self.name class Product(models.Model): 商品表 name models.CharField(max_length100, verbose_name商品名称) category models.ForeignKey(Category, on_deletemodels.CASCADE, verbose_name商品分类) price models.DecimalField(max_digits10, decimal_places2, verbose_name商品单价) stock models.IntegerField(default0, verbose_name库存数量) sales models.IntegerField(default0, verbose_name销量) create_time models.DateTimeField(auto_now_addTrue, verbose_name创建时间) class Meta: verbose_name 商品信息 verbose_name_plural verbose_name db_table product def __str__(self): return self.name class OrderInfo(models.Model): 订单表 order_no models.CharField(max_length50, verbose_name订单编号) product models.ForeignKey(Product, on_deletemodels.CASCADE, verbose_name商品) quantity models.IntegerField(default1, verbose_name购买数量) total_price models.DecimalField(max_digits10, decimal_places2, verbose_name订单总金额) status models.CharField(max_length20, verbose_name订单状态) order_date models.DateField(verbose_name下单日期) create_time models.DateTimeField(auto_now_addTrue, verbose_name创建时间) class Meta: verbose_name 订单信息 verbose_name_plural verbose_name db_table order_info def __str__(self): return self.order_no模型定义中有几个关键点ForeignKey表示外键关系一个分类下可以有多个商品一个商品可以有多条订单。on_deletemodels.CASCADE表示分类或商品被删除时关联数据也会同步删除。实际业务中也可以使用PROTECT防止误删。db_table用于指定数据库中的表名不指定时 Django 会默认生成应用名_模型名形式的数据表。DecimalField适合存储价格避免 Float 类型导致的精度问题。4.3 注册后台管理在analysis/admin.py中注册模型方便通过 Django Admin 后台直接维护数据# 文件路径analysis/admin.py from django.contrib import admin from .models import Category, Product, OrderInfo admin.register(Category) class CategoryAdmin(admin.ModelAdmin): list_display (id, name, create_time) search_fields (name,) admin.register(Product) class ProductAdmin(admin.ModelAdmin): list_display (id, name, category, price, stock, sales, create_time) list_filter (category,) search_fields (name,) admin.register(OrderInfo) class OrderInfoAdmin(admin.ModelAdmin): list_display (id, order_no, product, quantity, total_price, status, order_date) list_filter (status,) search_fields (order_no,)4.4 生成迁移文件并同步数据库定义好模型后执行以下命令生成迁移文件并同步到 MySQLpython manage.py makemigrations python manage.py migratemakemigrations会根据models.py中的变化生成迁移脚本migrate会把迁移脚本真正执行到数据库中。执行完成后可以登录 MySQL 查看SHOW TABLES;正常情况下应该能看到category、product、order_info这三张表以及 Django 自带的用户、权限等系统表。5. 数据分析与可视化核心代码5.1 使用 Django ORM 进行聚合统计可视化图表需要的数据不是原始表格数据而是类似于“每个月的销售额是多少”“每个分类的商品数量是多少”这种统计结果。Django ORM 提供了annotate和values方法实现分组聚合。下面是一个统计各商品分类商品数量的示例# 文件路径analysis/views.py from django.db.models import Sum, Count from django.shortcuts import render from .models import Product, OrderInfo, Category def category_statistics(): 统计每个分类下的商品数量 categories Category.objects.annotate(product_countCount(product)) data [] for category in categories: data.append({ name: category.name, value: category.product_count }) return data def sales_statistics(): 统计每个月的销售额 from django.db.models.functions import TruncMonth monthly_sales ( OrderInfo.objects .annotate(monthTruncMonth(order_date)) .values(month) .annotate(totalSum(total_price)) .order_by(month) ) months [] totals [] for item in monthly_sales: if item[month]: months.append(item[month].strftime(%Y-%m)) totals.append(float(item[total])) return months, totals其中TruncMonth是 Django 提供的日期截断函数可以把日期精确到月份然后按月份分组求和。如果不需要用到这个函数也可以先取出订单数据在 Python 中手动分组但效率会比数据库聚合差。5.2 首页数据统计视图编写一个视图函数把统计数据传给模板# 文件路径analysis/views.py from django.shortcuts import render from .models import OrderInfo, Product def index(request): 系统首页展示核心指标和图表数据 total_orders OrderInfo.objects.count() total_sales OrderInfo.objects.aggregate(totalSum(total_price))[total] or 0 total_products Product.objects.count() # 获取近 30 天每日销售额 from django.utils import timezone from datetime import timedelta end_date timezone.now().date() start_date end_date - timedelta(days29) daily_orders ( OrderInfo.objects .filter(order_date__range[start_date, end_date]) .values(order_date) .annotate(daily_totalSum(total_price)) .order_by(order_date) ) date_list [] sales_list [] for item in daily_orders: date_list.append(item[order_date].strftime(%m-%d)) sales_list.append(float(item[daily_total])) context { total_orders: total_orders, total_sales: round(total_sales, 2), total_products: total_products, date_list: date_list, sales_list: sales_list, category_data: category_statistics(), } return render(request, index.html, context)5.3 模板页面与 ECharts 图表展示在templates目录下创建base.html作为所有页面的基础模板!-- 文件路径templates/base.html -- !DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title{% block title %}网购数据可视化分析系统{% endblock %}/title link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.3.0/dist/css/bootstrap.min.css {% block extra_css %}{% endblock %} /head body nav classnavbar navbar-expand-lg navbar-dark bg-dark div classcontainer a classnavbar-brand href/网购数据分析/a div classcollapse navbar-collapse ul classnavbar-nav me-auto li classnav-itema classnav-link href/首页/a/li li classnav-itema classnav-link href/products/商品管理/a/li li classnav-itema classnav-link href/admin/后台管理/a/li /ul /div /div /nav div classcontainer mt-4 {% block content %}{% endblock %} /div script srchttps://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js/script {% block extra_js %}{% endblock %} /body /html创建templates/index.html展示数据指标和两个统计图表!-- 文件路径templates/index.html -- {% extends base.html %} {% block content %} div classrow div classcol-md-4 div classcard text-white bg-primary mb-3 div classcard-body h5 classcard-title商品总数/h5 p classcard-text fs-3{{ total_products }}/p /div /div /div div classcol-md-4 div classcard text-white bg-success mb-3 div classcard-body h5 classcard-title订单总数/h5 p classcard-text fs-3{{ total_orders }}/p /div /div /div div classcol-md-4 div classcard text-white bg-warning mb-3 div classcard-body h5 classcard-title总销售额/h5 p classcard-text fs-3{{ total_sales }}/p /div /div /div /div div classrow mt-4 div classcol-md-7 div classcard div classcard-header近30天销售额趋势/div div classcard-body div idsalesChart styleheight: 350px;/div /div /div /div div classcol-md-5 div classcard div classcard-header商品分类占比/div div classcard-body div idcategoryChart styleheight: 350px;/div /div /div /div /div {% endblock %} {% block extra_js %} script // 近30天销售额折线图 var salesChart echarts.init(document.getElementById(salesChart)); var dateList {{ date_list|safe }}; var salesList {{ sales_list|safe }}; salesChart.setOption({ tooltip: { trigger: axis }, xAxis: { type: category, data: dateList }, yAxis: { type: value }, series: [{ name: 销售额, type: line, smooth: true, data: salesList, areaStyle: {} }] }); // 商品分类占比饼图 var categoryChart echarts.init(document.getElementById(categoryChart)); var categoryData {{ category_data|safe }}; categoryChart.setOption({ tooltip: { trigger: item }, series: [{ name: 商品分类, type: pie, radius: 60%, data: categoryData }] }); /script {% endblock %}这里使用|safe过滤器是为了让 Django 模板不要转义数据中的引号和 HTML 符号。实际开发时如果数据是动态传入的字符串需要更谨慎地处理 XSS 风险。图表本身通过 ECharts 的 CDN 加载不需要下载单独的 JS 文件。5.4 配置 URL 路由在online_shopping_analysis/urls.py中配置路由# 文件路径online_shopping_analysis/urls.py from django.contrib import admin from django.urls import path from analysis import views urlpatterns [ path(admin/, admin.site.urls), path(, views.index, nameindex), ]如果后续添加商品列表页面、订单列表页面也可以在同一个urls.py中继续扩展path(products/, views.product_list, nameproduct_list), path(orders/, views.order_list, nameorder_list),6. 系统运行与验证6.1 创建超级管理员账号Django Admin 后台需要管理员账号才能登录。执行以下命令python manage.py createsuperuser按提示输入用户名、邮箱可留空和密码即可。6.2 准备演示数据为了让可视化图表有内容可展示需要先录入一些数据。有两种方式方式一通过 Django Admin 后台录入启动服务后访问http://127.0.0.1:8000/admin/登录后进入“商品分类”“商品信息”“订单信息”页面手动添加数据。方式二编写数据初始化脚本在analysis应用下创建init_data.py脚本一次性写入模拟数据# 文件路径analysis/init_data.py import os import django from datetime import date, timedelta import random os.environ.setdefault(DJANGO_SETTINGS_MODULE, online_shopping_analysis.settings) django.setup() from analysis.models import Category, Product, OrderInfo def init_data(): # 创建分类 categories [手机数码, 家用电器, 服饰鞋包, 食品生鲜, 美妆护肤] category_objs [] for cate in categories: obj, created Category.objects.get_or_create(namecate) category_objs.append(obj) # 创建商品 product_names { 手机数码: [智能手机, 蓝牙耳机, 智能手表, 平板电脑], 家用电器: [空气炸锅, 扫地机器人, 电饭煲, 破壁机], 服饰鞋包: [运动鞋, 双肩包, 卫衣, 休闲裤], 食品生鲜: [车厘子, 坚果礼盒, 有机牛奶, 牛排套餐], 美妆护肤: [保湿面霜, 精华液, 口红, 防晒霜], } products [] for cate in category_objs: names product_names[cate.name] for name in names: product Product.objects.create( namename, categorycate, pricerandom.uniform(50, 5000), stockrandom.randint(10, 500), salesrandom.randint(0, 1000), ) products.append(product) # 创建订单 for i in range(200): product random.choice(products) quantity random.randint(1, 5) order_date date.today() - timedelta(daysrandom.randint(0, 30)) OrderInfo.objects.create( order_nofNO2024{i1:06d}, productproduct, quantityquantity, total_priceproduct.price * quantity, statusrandom.choice([已完成, 待发货, 已取消]), order_dateorder_date, ) print(数据初始化完成) if __name__ __main__: init_data()执行脚本python analysis/init_data.py注意这个脚本只是演示用的数据初始化方式不是项目必需的模块。如果你不希望保留它录入完数据后可以直接删除。6.3 启动服务在项目根目录执行python manage.py runserver看到以下输出说明启动成功Starting development server at http://127.0.0.1:8000/访问http://127.0.0.1:8000/可以看到首页的数据卡片和图表。访问http://127.0.0.1:8000/admin/可以进入后台管理数据。7. 常见问题与排查思路在配置和运行 Django MySQL 项目时大家比较容易遇到下面几类问题。我整理了一张排查表帮助快速定位错误。问题现象常见原因解决思路ModuleNotFoundError: No module named MySQLdb未安装 MySQL 驱动或 pymysql 未生效安装 mysqlclient或使用 pymysql 并执行pymysql.install_as_MySQLdb()django.db.utils.OperationalError: (1045, Access denied for user...)MySQL 用户名或密码错误检查 settings.py 数据库配置确认账号密码和权限django.db.utils.OperationalError: (1049, Unknown database)数据库未创建先在 MySQL 中创建数据库再执行 migrate中文乱码数据库字符集不是 utf8mb4建库时指定CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ciError: Port 8000 is already in use8000 端口被占用换端口启动python manage.py runserver 8080Table xxx already exists迁移记录与数据库不一致谨慎处理备份后可通过python manage.py migrate --fake解决不熟悉时优先咨询页面图表不显示JS 加载失败或数据格式不对打开浏览器开发者工具检查 Console 报错和接口返回的数据格式7.1 数据库连接失败如果你看到类似django.db.utils.OperationalError: (2003, Cant connect to MySQL server on 127.0.0.1)的报错可以按顺序排查检查 MySQL 服务是否启动。Windows 可以在服务管理器中查看 MySQL 服务状态。检查settings.py中的HOST和PORT是否写对。使用 Navicat 或命令行尝试连接 MySQL确认账号密码可用。如果 MySQL 版本是 8.0确认密码认证插件是否为caching_sha2_password部分旧版本驱动可能不兼容需要更新驱动版本或修改认证方式。7.2 迁移命令报错如果执行python manage.py migrate时报错可以先检查INSTALLED_APPS中是否已经注册了analysis应用。另外如果改过models.py后报出字段缺失、字段类型不匹配等错误不要直接去数据库手动改表。正确做法是备份好数据库删除对应应用migrations目录中最近生成的迁移文件重新执行makemigrations和migrate。如果数据库中已经有重要数据这个操作会带来数据丢失风险务必先做备份。7.3 图表区域空白图表空白通常有下面几种原因ECharts 的 CDN 资源加载失败。可以检查网络连接或把echarts.min.js下载到本地static/js目录。容器div没有高度。ECharts 初始化前必须保证容器有明确的宽度和高度如果容器高度为 0图表会渲染不出来。JavaScript 数据格式不对。比如date_list传到模板后变成了字符串可以在模板中输出查看必要时使用|safe过滤器。8. 课设/毕设写作与答辩建议8.1 课程设计报告结构如果这是你的课程设计或毕业设计报告结构可以参考下面的通用模板章节内容建议第1章 绪论项目背景、研究意义、国内外现状第2章 相关技术介绍Python、Django、MySQL、ECharts 简介第3章 系统分析可行性分析、功能需求分析、用例图第4章 系统设计总体架构、数据库表结构、页面设计第5章 系统实现核心代码、关键功能截图、运行效果第6章 系统测试测试环境、测试用例、测试结果第7章 总结与展望项目总结、不足与改进方向写报告时最容易犯的错误是“技术介绍占了一半核心实现只有两页”。建议把重点放在系统设计和系统实现部分用截图 代码片段说明你做了什么、解决了什么问题。8.2 答辩时需要准备的内容答辩时评委通常会关注以下几点系统是否真的能跑起来演示过程是否流畅。数据库表结构是否合理为什么这样设计。用到了哪些 Django 核心功能ORM 的聚合查询是否理解。图表的数据是怎么传递的前端如何拿到后端数据。项目有哪些可以优化的地方。所以建议在答辩前准备好几份演示数据把页面图表效果调到比较饱满的状态。同时把项目跑通后再自己走一遍“新增商品 - 新增订单 - 首页图表变化”的流程这样回答“数据怎么影响图表”时会更从容。8.3 代码二次开发建议如果你拿到的源码项目名、类名和你的课程题目不完全一致可以进行以下简单的定制修改项目名称和 App 名称。修改templates中的标题、导航栏、页面文案。替换数据集或模拟数据。增加新的统计维度比如按地区统计、按年龄段统计。增加导出 Excel 报表功能。引入用户登录注册功能区分普通用户和管理员。修改项目名称时除了目录名还需要同步修改settings.py中的ROOT_URLCONF、WSGI_APPLICATION等配置项中的模块路径。建议全局搜索旧名称逐一替换。8.4 工程实践建议这里再强调几条工程实践层面的建议不只是为了应付课设对你以后写项目也有帮助。配置与代码分离不要在生产环境代码里直接写死数据库密码。课设阶段问题不大但如果有条件可以使用环境变量或config.py文件统一管理敏感配置。例如import os DATABASES { default: { ENGINE: django.db.backends.mysql, NAME: os.getenv(DB_NAME, shopping_analysis), USER: os.getenv(DB_USER, root), PASSWORD: os.getenv(DB_PASSWORD, ), HOST: os.getenv(DB_HOST, 127.0.0.1), PORT: os.getenv(DB_PORT, 3306), } }备份数据库涉及数据库修改、模型迁移前先备份数据库mysqldump -u root -p shopping_analysis shopping_analysis_backup.sql恢复时可以执行mysql -u root -p shopping_analysis shopping_analysis_backup.sql迁移操作前谨慎Django 的迁移命令是项目中最容易出问题的环节之一。每次改动模型前先想清楚字段变化的影响范围。如果是在已经提交过的项目中操作不要随意删除旧迁移文件。合理处理异常写视图函数时尽量在不同场景下给用户明确反馈。比如找不到商品时返回 404参数不合法时返回提示信息。Django 内置的get_object_or_404、Http404就很常用。from django.shortcuts import get_object_or_404, render from .models import Product def product_detail(request, pk): product get_object_or_404(Product, pkpk) return render(request, product_detail.html, {product: product})9. 总结与下一步学习方向本文从一个课设/毕设常见的需求出发完整拆解了Django 网购数据可视化分析系统的设计与实现过程。你跟着文章走一遍可以掌握这些内容使用 Django 创建项目和 App配置连接 MySQL。通过 ORM 定义分类、商品、订单三张核心数据表。使用 Django Admin 后台快速完成数据维护。使用聚合查询和 ECharts 展示统计图表。配置路由和模板完成前后端数据传递。如果你之前没有接触过 Django建议在跑通这个系统后再手动写一遍代码不要直接复制粘贴完就结束。把models.py的每个字段、views.py的每个查询、模板里的每个模板标签都理解透彻答辩时才会心中有数。接下来可以继续深入的方向包括学习 Django 的用户认证系统把这套系统扩展成带登录注册的完整平台。学习 Django REST Framework把这套数据统计分析能力做成 API 接口。学习 Pandas 和 Matplotlib对比 Python 数据分析和 Web 可视化的差异。学习 MySQL 索引优化思考订单量变大时如何提升查询速度。如果这篇文章对你有帮助建议收藏备用动手实践时遇到的问题也欢迎在评论区交流。