(四)理解模型 Model
Django 的 MTV,我们已经讲了 T(Template)和 V(View),现在来到了最后一:M(Model)
数据模型是 Django 入门最大的难点,消化这一步的内容就需要花点力气了。下面我们先介绍一下 Django 的数据模型设计
Django 在数据模型方面的设计堪称典范,列举一些闪光点:
- 由于高度解耦的设计,可轻松切换各种关系型数据库(默认的 SQLite,可选 MySQL、PostgreSQL、Oracle 等等)
- 强大的 ORM(Object Relation Mapping,对象关系映射)模块,使得用 Python 操作数据库非常轻松,免去了使用 SQL 的麻烦
- 优秀的数据库迁移机制(Migration),修改数据模式(Schema)比较方便,能够适应不断变化的功能需求
我们暂且选择默认的 SQLite 数据库,省去了配置数据库的烦恼
理解 ORM
如果你写过 c++ 或 go ,对于 ORM 来说应该是不陌生的,ORM 能够将面向对象的代码转换成相应的 SQL 语句,从而对数据库进行操作
SQL 是用于访问和处理数据库的标准的计算机语言,但是直接写在代码里面显然难以维护,而且对使用者的要求也非常高,写的糟糕的 SQL 代码查询效率非常低下。因此,使用设计良好的 ORM 不仅让代码可读性更好,也能帮助开发者进行查询优化,节省不少力气
来看一些简单的 Django ORM 例子:
# 查询所有模型
# 等价于 SELECT * FROM Blog
Blog.objects.all()
# 查询单个模型
# 等价于 SELECT * FROM Blog WHERE ID=1
Blog.objects.get(id=1)
# 添加单个模型
# 等价于 INSERT INTO Blog (title, content) VALUES ('hello', 'world')
blog = Blog(title='hello', content='world')
blog.save()
理解数据库迁移
数据库迁移是指将用 Django 定义的模型转换成 SQL 代码(即迁移文件),并在数据库中进行建表操作(或更新表),如图

实现一个数据模型
在 news/models.py 中定义数据模型 Post ,包括标题 title 字段和 content 字段,代码如下:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
def __str__(self):
return self.title
创建数据迁移文件:
python3 manage.py makemigrations
# 输出:
Migrations for 'news':
news/migrations/0001_initial.py
- Create model Post
并且成功地自动创建了 news/migrations/0001_initial.py 迁移脚本,开始数据迁移
python manage.py migrate
输出如下

数据迁移完后,创建数据库迁移完成后,我们就可以创建用于登录后台管理的超级用户:
python3 manage.py createsuperuser
按照提示填写用户名和密码即可,然后访问 localhost:8000/admin,进入后台系统的登录页面:

配置后台管理接口
因为我们没有实现 news 应用的后台管理接口,在 news/admin.py 中写入:
from django.contrib import admin
from .models import Post
admin.site.register(Post)
再次访问 localhost:8000/admin 就可以看到 news 应用和 Post 模型了:


视图中添加数据查询
最后,我们在视图中加入从数据库中查询的代码,代码如下,对伪数据进行替换即可:
from django.shortcuts import render
from .models import Post
def index(request):
context = { 'news_list': Post.objects.all() }
return render(request, 'news/index.html', context=context)
访问 localhost:8000 就可以看到刚才在后台管理系统添加的新闻

总结
通过这四篇的教程,我们已经成功做出了一个简陋的 新闻发布网站,并且可以从 后台管理系统中添加新闻,最终展示到我们的网站首页上
希望这份专栏能够让你对 Django 里最重要的一些概念和操作有基本的了解
Django 还有很多很多的高级玩法,例如数据模型中的高级查询、字段索引、更换数据库等等,模板中的继承机制、内部标签等等,还有视图中如何处理各类请求(POST、PUT等),这些内容或许我不会出,但如果你对 Django 感兴趣,希望你能够主动去了解 学习
愿诸君顺遂