apps/blog/models.py
踩着“Hello World”,走向你的第一个 Django 网站
记得我刚入行那会儿,前端做了一阵子 Vue,但总觉得对整个系统的掌控力不够。后来决定转后端,第一次上手 Django 的时候,其实内心是有点小激动的——都说 Python 写后端简单高效,Django 更是被誉为“开箱即用”的利器。
今天这篇文章,我想以一个从业五年多的老码农身份,带你们从零开始搭建一个完整的 Django 项目,不只教你“跑起来”,更想和你聊聊在真实项目中你会遇到的问题、踩过的坑,以及如何做出一些更贴近实际生产需求的设计选择。
一、为什么选 Django?

Django 是 Python 生态里最成熟、社区最大、文档最完善的 Web 框架之一。它自带 Admin 后台、ORM、用户系统、模板引擎、表单验证等等功能,非常适合用来快速构建 MVP(最小可行产品)或者中小型网站服务。
我当时参与的第一个后台管理类项目就是基于 Django 搭建的,需求包括:
- 用户权限管理
- 图文内容发布系统
- 后台数据统计面板
- 接口供前端调用
当时我们团队人手不多,时间又紧,Django 就成为了一个非常合适的选择。
二、问题来了:从哪里下手?

对于新手来说,最容易遇到的一个问题是:“Django 太复杂了,一开始根本不知道怎么组织代码”。比如,models.py 放哪?views 怎么分层?templates 和 static 又该怎么配置?
而且很多教程都是直接来个 startproject,再一个 startapp,接着写个 Hello World 页面就完事了。但在真实项目中,这些远远不够。
我记得我当时也是懵的,第一天搭环境,第二天写 models,第三天发现数据库迁移报错……
核心挑战有以下几个:
- 项目结构混乱,多个 App 分工不清。
- 数据库设计不合理,导致后期扩展性差。
- URL 配置与 View 逻辑耦合严重,维护困难。
- 部署方案没经验,上线时踩了 N 个坑。
这些问题,在新手阶段几乎是必然要经历的,关键是我们能不能从中吸取教训、总结出一套合理的开发规范。
三、解决方案:从零开始搭建 Django 项目
1. 初始化项目结构
首先,我们需要先装好 Python 和 pip,然后安装 Django:
pip install django
接着创建项目骨架:
django-admin startproject mysite
cd mysite
python manage.py runserver
这时候访问 http://127.0.0.1:8000/,应该能看到“Congratulations!”页面。
不过这只是一个基础框架,真正开发之前,最好先规划一下目录结构,特别是当你需要多个模块的时候。
我的做法一般是:
mysite/
├── config/ # 存放 settings, urls, wsgi, asgi 等
├── apps/ # 所有业务 App 放这里
│ ├── blog/
│ └── user/
├── requirements.txt # 依赖文件
├── manage.py
└── README.md
这样结构清晰,也方便多人协作。
2. 创建 App 并注册
假设我们要做一个博客系统,那么我们可以创建 blog 应用:
python manage.py startapp blog
别忘了去 config/settings.py 中注册这个 App:
INSTALLED_APPS = [
...
'apps.blog',
]
3. 设计模型(Model)
以 Blog 文章为例,最基本的字段应该是标题、作者、正文、发布时间等。
from django.db import models
from django.contrib.auth import get_user_model
User = get_user_model()
class Article(models.Model):
title = models.CharField("标题", max_length=200)
author = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField("内容")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
记得每次修改 model 都要执行 migrate:
python manage.py makemigrations
python manage.py migrate
4. 构建视图和接口
基础视图
# apps/blog/views.py
from django.shortcuts import render
from .models import Article
def index(request):
articles = Article.objects.all()
return render(request, 'blog/index.html', {'articles': articles})
RESTful 接口(配合 DRF)
如果你希望对外提供 JSON 数据,可以使用 Django REST Framework(DRF),这是我工作以来几乎每个项目都集成的核心组件。
安装:
pip install djangorestframework
配置到 settings.py:
INSTALLED_APPS += ['rest_framework']
写个简单的 API 示例:
# apps/blog/serializers.py
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
fields = '__all__'
# apps/blog/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import ArticleSerializer
from .models import Article
class ArticleList(APIView):
def get(self, request):
articles = Article.objects.all()
serializer = ArticleSerializer(articles, many=True)
return Response(serializer.data)
路由部分:

# apps/blog/urls.py
from django.urls import path
from .views import ArticleList
urlpatterns = [
path('api/articles/', ArticleList.as_view()),
]
# config/urls.py
from django.urls import include, path
urlpatterns = [
...
path('blog/', include('apps.blog.urls')),
]
访问 /blog/api/articles/,你应该就能看到返回的 JSON 列表。
四、开发过程中的那些坑
1. 数据库迁移冲突
有时候在多人协作环境中,如果两个人同时改了同一个 Model 的字段,生成 migrations 后,运行 migrate 会出现冲突。这时你需要手动编辑 migration 文件解决冲突,或者使用:
python manage.py migrate --fake-initial
但请务必确认这是安全操作!
2. URL 配置嵌套错误
很多人把 app 的 url 直接写进主 urls.py,这样会导致后期维护困难。推荐每个 App 自己维护自己的 urls.py,通过 include 引入。
切记:不要在主 urls.py 中导入 views。
3. 模板路径配置不正确
Django 默认会在应用目录下找 templates 文件夹,但如果你想统一模板路径,建议在 settings.py 中设置:
TEMPLATES = [
{
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
}
]
这样所有 template 统一放在根目录 templates 下。
五、性能与架构优化心得

在真实的生产环境中,有几个点我觉得尤其重要:
1. 数据库索引设计
比如我们在 Article 表中经常按作者查询文章列表,就需要为 author 字段加上索引:
author = models.ForeignKey(User, on_delete=models.CASCADE, db_index=True)
2. 查询优化:避免 N+1 问题
比如你有一个评论系统,每篇文章有若干评论,如果没有优化,在遍历每篇 article 获取 comments 时就会出现大量数据库查询。
解决方式是使用 select_related 或 prefetch_related:
articles = Article.objects.select_related('author').all()
这对提升接口性能非常关键。
3. 使用缓存
比如我们可以缓存热门文章或接口响应:
from django.core.cache import cache
def get_hot_articles():
key = 'hot_articles'
result = cache.get(key)
if not result:
result = Article.objects.filter(hot=True)
cache.set(key, result, timeout=60 * 5) # 缓存 5 分钟
return result
也可以搭配 Redis 来实现分布式缓存,适合大规模系统。
六、部署经验分享(Production 部署)
开发完成后,上线部署也是一大挑战。我自己踩过不少坑。
1. 服务器选型建议
- 小型项目:Nginx + Gunicorn + SQLite 即可
- 中大型项目:Nginx + Gunicorn + PostgreSQL + Redis + Celery
2. 常见部署工具
Gunicorn:Python WSGI Server,启动命令:
gunicorn -w 4 config.wsgi:applicationNginx:反向代理静态资源
server { listen 80; server_name example.com; location /static/ { alias /path/to/static/; } location / { proxy_pass http://unix:/tmp/gunicorn.sock:/; } }
3. 环境变量管理
开发 vs 测试 vs 生产环境下配置不同,强烈建议使用 .env + django-environ 来统一管理:
pip install django-environ python-decouple
# config/settings.py
import environ
env = environ.Env()
environ.Env.read_env()
DEBUG = env('DEBUG')
SECRET_KEY = env('SECRET_KEY')
DATABASES = {'default': env.db()}
这样可以把敏感信息从代码中剥离,提高安全性。
七、经验总结和建议
经过这几年的实战,我总结了几条写 Django 项目的建议:
- 结构清晰比功能完整更重要。一开始就定义好目录结构,App 职责分明,有助于后期维护。
- 合理使用 ORM,而不是写原生 SQL。虽然 ORM 有时性能不如 SQL,但它带来的稳定性和易读性远胜于那一点点性能损失。
- API 优先设计原则。即使是前后端同构的项目,也应该保持 API 的清晰设计,便于未来可能接入移动端或其他服务。
- 提前规划缓存与数据库索引。性能优化不是等出了问题再考虑的事情。
- 版本控制 + CI/CD 自动化部署。用 GitHub Actions 或 Jenkins 实现自动测试与部署,能极大提升效率。
八、结语
Django 是一个成熟的框架,它的理念是“松耦合,高内聚,强调开发效率”,这一点在工作中让我受益良多。
从最初的 Hello World 开始,到如今能够独立负责完整的后端架构设计,这一路走下来,最大的感触是:技术本身并不难,难的是如何在真实的项目场景中做出合理的设计与取舍。
如果你也在学习 Django 或者准备入坑 Python 后端,希望这篇文章能给你带来一些启发。
如果你有兴趣,我后面还可以继续写关于 Django + Vue 前后端分离的实战、Django + Celery 异步任务处理等内容,欢迎留言交流!
本文首发于个人博客,如需转载请注明出处 🙏

评论 0