Django模型超60个字段是否合理?项目开发最优方案咨询
Django 开发问题解答
是否需要将Excel数据存入数据库
不需要设计字段数超60的模型,更不需要为不同用户重复加字段,根据你的需求二选一即可:
- 无历史数据查询需求选方案1:仅存储原始Excel文件和最终生成的PDF,完全不将解析后的内容入库。如果你的业务逻辑只是上传Excel后单次生成图表和PDF,用户后续不需要对历史上传的Excel内容做筛选、统计类操作,就用这个方案:上传后直接把文件读入内存用pandas处理,生成完PDF就释放内存,开发成本最低,也不会浪费数据库存储空间。
- 有历史数据查询需求选方案2:用Django自带的
JSONField存储解析后的结构化数据。只需要设计一个极简的关联模型即可,示例结构如下:
from django.db import models from django.contrib.auth.models import User class UserReport(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="reports") upload_excel = models.FileField(upload_to="user_excels/") excel_data = models.JSONField(null=True, blank=True) result_pdf = models.FileField(upload_to="user_reports/", null=True, blank=True) create_time = models.DateTimeField(auto_now_add=True)
不管Excel里有60个还是更多变量,都可以整合成键值对存在excel_data字段里,完全不需要调整表结构。
现有开发流程优化建议
你当前的整体规划逻辑是通顺的,两个可以调整的点能大幅提升开发效率和用户体验:
- 大文件处理改成异步:如果用户上传的Excel行数多、生成的图表量大,同步处理很容易触发请求超时,建议引入Celery做异步任务,用户上传后先返回「处理中」的提示,任务执行完成后再通知用户查看结果。
- 替换PDF生成工具:ReportLab手写PDF样式的成本很高,你已经用Chart.js生成了带图表的HTML页面,改用
WeasyPrint做HTML转PDF,对前端样式、JS生成的图表兼容性更好,开发效率至少提升3倍。
简化实现路径
- 完成上述
UserReport模型的创建,前端做Excel上传的表单入口,上传成功后生成对应UserReport记录 - 触发处理逻辑:小文件同步处理、大文件走异步,用pandas读取Excel内容,按需决定是否存入
excel_data字段 - 用解析后的数据渲染带Chart.js图表的HTML模板,再用WeasyPrint将HTML转为PDF存储到
result_pdf字段 - 用户个人页直接筛选当前登录用户关联的所有
UserReport记录,展示PDF下载入口即可
内容的提问来源于stack exchange,提问作者PeroPuri
相关产品推荐
相关产品推荐

