从零开始搭网站:Django 实战入门与项目实践

杰出之战士
2025-06-15 23:17
阅读 635

开篇:一次“临时救场”的需求

开篇:一次“临时救场”的需求

去年公司接到一个新客户的需求,要快速搭建一个内部管理后台,用于跟踪销售数据和客户服务记录。时间紧、任务重,我被安排负责后端开发。一开始想着用现成的 CMS 搭建,但客户需求比较特殊,页面和功能都需要高度定制。

那阵子我刚好在研究 Django,对它的简洁风格和强大的 Admin 系统印象深刻。于是决定尝试用它来快速搭建原型。当时还担心会不会因为经验不足耽误进度,但没想到这趟旅程让我彻底爱上了这个框架,并且成功在一周内交付了基础版本,后面也不断迭代成为部门内部常用的工具之一。

今天想借此机会,结合自己的实战经历,跟大家分享一下我是怎么用 Django 快速上手并完成项目的,希望能给刚入门的同学带来一些实用的帮助。


问题描述:如何又快又好地搭建一个定制化 Web 后台?

问题描述:如何又快又好地搭建一个定制化 Web 后台?

这次项目的核心痛点是:

  1. 时间紧张:客户要求两周内看到可用原型;
  2. 功能定制性强:需要处理销售数据导入、用户权限管理、报表展示等;
  3. 团队技术栈分散:前后端协作需要统一接口规范,方便对接后续前端页面;
  4. 后期维护考虑:需要保证系统的可扩展性和可维护性,避免未来修改困难。

当时我们尝试过几种方案,比如 Node.js + Express 或者 Flask,但在权限管理、Admin 配置和模型设计方面都显得有些笨重或需要大量额外开发工作。最终选择 Django,除了熟悉度外,主要看重它以下几个优势:

  • ORM 强大,数据库操作直观高效;
  • 内置 Admin 可以快速搭建后台界面;
  • 自带认证系统,开箱即用;
  • 接口设计灵活,适合 RESTful API 开发;
  • 社区活跃,文档完备。

解决方案:Django 的模块化架构+DRF 构建全栈应用

我们最终采用的技术架构如下:

系统架构设计图-2

[浏览器] <---> [React 前端页面] <===> [RESTful API (Django Rest Framework)] 
                     ↑
                 数据库(PostgreSQL)

整体结构清晰,职责分明。Django 负责核心业务逻辑、数据存储、用户权限控制和 API 提供;前端通过 Axios 请求调用后端接口进行交互;数据库使用 PostgreSQL,支持 JSON 类型字段,便于日后拓展。

为了满足快速开发,我把整个项目拆分成几个模块:

  • sales: 销售记录模块
  • customers: 客户信息管理
  • reports: 报表统计功能
  • users: 用户权限和角色管理

每个模块包含 models、views、urls、serializers 等标准结构,便于复用和维护。

为什么选择 DRF?

虽然 Django 的模板渲染可以做到前后端不分离,但考虑到长期维护和接口统一性,我们一开始就决定采用 RESTful 风格设计 API,这样不仅方便前后端协作,还能为未来可能接入移动端或其他服务做准备。


代码实践:一步步带你走完一个最简流程

接下来我会结合我的项目案例,带大家从创建项目到构建第一个功能模块。

第一步:安装与初始化

pip install django djangorestframework
django-admin startproject sales_dashboard .
python manage.py startapp sales

记得将新建的 app 添加到 INSTALLED_APPS 中,同时添加 rest_framework

INSTALLED_APPS = [
    ...
    'sales',
    'rest_framework',
]

第二步:定义模型

sales 模块为例,这里我们要存储每一条销售记录的基本信息:

# sales/models.py
from django.db import models
from django.contrib.auth import get_user_model

User = get_user_model()

class Sale(models.Model):
    customer_name = models.CharField(max_length=255)
    product = models.CharField(max_length=100)
    amount = models.DecimalField(max_digits=10, decimal_places=2)
    created_at = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.customer_name} - {self.amount}"

然后执行 migrations:

python manage.py makemigrations
python manage.py migrate

第三步:配置 Admin 后台

有了 Admin,我们可以直接在里面查看和管理数据:

# sales/admin.py
from django.contrib import admin
from .models import Sale

@admin.register(Sale)
class SaleAdmin(admin.ModelAdmin):
    list_display = ['customer_name', 'product', 'amount', 'created_at']
    search_fields = ['customer_name', 'product']

运行服务后访问 /admin 页面就能看到自动为我们生成的管理界面了!

第四步:编写 API 接口

用 DRF 来暴露 RESTful 接口是非常自然的选择,先创建序列化类:

# sales/serializers.py
from rest_framework import serializers
from .models import Sale

class SaleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Sale
        fields = '__all__'

然后写 ViewSet 和路由:

# sales/views.py
from rest_framework import viewsets
from .models import Sale
from .serializers import SaleSerializer

class SaleViewSet(viewsets.ModelViewSet):
    queryset = Sale.objects.all()
    serializer_class = SaleSerializer

最后在主路由中注册:

# sales_dashboard/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from sales.views import SaleViewSet

router = DefaultRouter()
router.register(r'sales', SaleViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

此时请求 /api/sales/ 就能获取到所有销售记录了,增删改查接口也都齐活!


踩坑经验:那些你可能会遇到的问题及应对方式

API接口文档-1

在整个开发过程中,我也踩了不少坑,分享几个印象深刻的例子。

1. 数据迁移出错:南迁失败怎么办?

刚开始时我频繁修改模型字段,结果有几次执行 migrate 出现数据库结构不一致的问题。解决方法一般是:

  • 查看 migration 文件是否冲突;
  • 使用 --fake 参数强制同步状态(慎用);
  • 如果环境允许,清理数据库重建;
  • 生产环境则必须谨慎对待,提前做 DB Schema 设计。

💡建议:多练习迁移流程,在开发初期就规划好字段,减少重构次数。

2. DRF 分页设置不生效?

我在返回 API 列表的时候发现分页不生效。检查了很久才发现原来是忘记在 settings 中启用全局分页配置:

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 20,
}

加上这段以后立马就好用了。

3. Admin 显示字段太多,加载很慢怎么办?

随着 Sale 数据量增加,Admin 页面打开特别慢。后来发现是因为默认会加载全部字段,尤其是关联表的字段。这时候可以用以下优化手段:

  • 在 ModelAdmin 中显式指定 list_display
  • 使用 select_related() 减少查询次数;
  • 对于不需要显示的大字段使用 exclude 排除掉。

例如:

class SaleAdmin(admin.ModelAdmin):
    list_display = ['id', 'customer_name', 'product', 'amount']
    exclude = ('large_json_field', )
    def get_queryset(self, request):
        return super().get_queryset(request).select_related('owner')

这些小技巧对性能提升非常有效!


效果总结:一周上线,后续持续迭代

项目交付后取得了不错的效果:

  • 第一周实现核心功能并部署上线;
  • 后续两个月根据反馈逐步加入权限分级、图表分析、Excel 导入等功能;
  • 前端用 React 接入接口顺畅;
  • 因为使用 DRF,后续还很容易接入了微信小程序作为移动入口。

更重要的是,这套后台现在成为了公司多个项目的通用模块,节省了大量重复开发时间。


经验分享:几点实用建议送给大家

作为一名亲历者,我有一些真心建议想送给正在学习或准备使用 Django 的朋友们:

1. 不要过度设计,先跑起来再说

很多新手总想着先把结构搞完美再动手写,其实没必要。Django 最大的魅力就是简单易上手,先让东西跑起来比什么都重要。等你真正开始调试才明白哪里需要重构。

2. 多用内置组件,少造轮子

Django 的 Admin、Authentication、ORM、中间件等等都是经过多年打磨的精华,能用尽量别自己写。除非真的有必要,否则没必要重复造轮子。

3. 注意权限模型的设计

我早期忽略了权限模型的重要性,后来在多个项目中吃过亏。推荐使用 Django Guardian 或 dj-rest-auth 这类成熟的扩展包来帮助管理细粒度权限。

4. 保持良好的目录结构

尤其当项目复杂起来之后,合理的目录结构非常重要。每个 App 保持独立功能模块,有助于管理和测试。

5. 生产环境一定要配置好日志和监控

Django 默认的日志输出很简单,实际部署时一定记得配置 logging 模块,记录错误、请求日志、性能指标等信息。我还结合 Sentry 做异常上报,极大提高了问题排查效率。


结语:Django 是个值得信赖的老朋友

从最初的临时需求,到现在我们已经在多个项目中使用 Django,它几乎每次都给了我稳定的体验。尤其是在快速开发、后台管理、API 暴露等方面,真的是得力助手。

如果你刚刚开始学 Python Web 开发,或者正苦于找不到合适的框架来做项目,强烈推荐试试 Django —— 它不仅成熟稳定,而且社区丰富、文档详细,绝对是你不会后悔的选择。

最后,希望这篇文章对你有所帮助。如果有任何问题欢迎留言交流!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝