外观
执行数据库迁移
创建完数据模型后,接下来就是执行数据库迁移。Django支持多种数据库,默认情况使用的是MySQL数据库。可以在项目配置blog/settings.py文件中查看,内容如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}若想将数据库改为MySQL数据库,则需要修改配置文件,代码如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 将驱动设为MySQL
'NAME': 'django_study', # 数据库名称
'USER': 'root', # 用户名
'PASSWORD': 'root' # 密码
}
}需要先创建django_study数据库,因为Django不会为我们自动创建数据库。
然后进入到项目的venv环境中使用pip install pymysql安装pymysql。

然后在blog\blog\__init__.py中添加如下代码:
import pymysql
# 为实现版本兼容,此处设置mysqlclient的版本
pymysql.version_info = (1, 4, 13, 'final', 0)
pymysql.install_as_MySQLdb()然后再执行如下命令,创建数据表。
python manage.py makemigrations
它会在article/migrations目录下生成一个0001_initial.py文件,它就是数据库迁移文件。
接着再执行如下命令,实现数据库迁移。
python manage.py migrate
这个命令执行完之后就可以看到创建的数据表了。除了article_article和article_user外,还有Django创建的其他数据表。
Django的数据库迁移非常强大,若想要改变数据表的模型,只需要修改models.py中的模型类中的字段,然后重新执行上面的两个脚本即可。
python manage.py makemigrations
python manage.py migrate数据库迁移分为两步是为了能够在代码控制系统上提交迁移数据并使其能在多个应用中被使用。这不仅仅会让开发更加简单,也给别的开发者和生产环境的使用带来方便。
了解Django数据API
我们进入交互式Python命令行,尝试一下Django提供的API。通过下面的命令打开交互式命令行。
python manage.py shell
导入数据模型命令如下。
from article.models import User, Article- 添加数据
添加数据有两种方法。
方法一:
user1 = User.objects.create(id=1, username='qi', email='2318110891@qq.com')方法二:
user2 = User(id=2, username='zhangsan', email='zhangsan@qq.com')
user2.save()先输入第一条命令后,查看数据库,数据会被添加,但是第二个命令输入第一句后数据不会被添加,必须要使用save()方法才能保存数据。
观察数据库,可以看到数据被保存了。

- 查询数据
查询User表中的所有数据:
User.objects.all()它的返回值是一个QuerySet对象。

可以通过遍历QuerySet对象获取每一个用户的详细信息。
users = User.objects.all()
for user in users:
print(f'id:{user.id}, user:{user.user}, email:{user.email}')
查询User表单数据,可以使用如下命令。
User.objects.first() # 获取第一条记录
User.objects.get(id=1) # 括号内要加入指定的条件,因为get()方法只返回一个确定值
此外,还可以根据指定的条件查询数据,例如:
User.objects.filter(user_exact='qi') # 指定user字段值必须为某值
User.objects.filter(user_iexact='qi') # 忽略大小写
User.objects.filter(id_gt=1) # 查找id值大于1的
User.objects.filter(id_lt=100) # 查找id值小于100的
# 过滤掉所有user字段值包含“n”的记录,然后按照id进行升序排序
User.objects.filter(user_contains='n').order_by('id')
# 过滤出所有user字段值包含“n”的记录,不区分大小写
User.objects.filter(user_icontains='n')- 修改数据
修改之前需要查询数据或数据集,然后对响应的字段进行赋值,代码如下。
user = User.objects.get(id=1)
user.user = 'qi1'
user.save()运行此代码后,从下图可以看到数据被改变了。

- 删除数据
删除数据与修改数据类似,也需要先找到对应的数据,然后调用delete方法。
User.objects.get(id=1).delete()管理后台
Django提供了一个特别强大的后台,只需要几行命令即可生成一个后台管理系统。
在终端执行以下命令,就可以创建一个管理员账号。
python manage.py createsuperuser
创建完成后启动服务器,在浏览器中输入127.0.0.1:8000/admin,即可访问后台。

使用之前的用户名和密码登录,即可看到后台了。

定义好数据模型,就可以配置管理后台了。修改article/admin.py配置文件,在admin.py中创建UserAdmin和ArticleAdmin后台控制模型类,并全部继承自admin.ModelAdmin模型类。设置属性,最后将数据模型绑定到管理后台。代码如下。
from article.models import User, Article
from django.contrib import admin
# Register your models here.
class UserAdmin(admin.ModelAdmin):
# 配置展示列表,在User板块下的列表显示
list_display = ('user', 'email')
# 配置过滤查询字段,在User板块下右侧过滤框
list_filter = ('user', 'email')
# 配置可以搜索的字段,在User板块下右侧搜索框
search_fields = ('user', 'email')
class ArticleAdmin(admin.ModelAdmin):
# 配置展示列表,在User板块下的列表显示
list_display = ('title', 'content', 'publish_time')
# 配置过滤查询字段,在User板块下右侧过滤框
list_filter = ('title',) # list_filter应该是列表或元组
# 配置可以搜索的字段,在User板块下右侧搜索框
search_fields = ('title',) # search_fields应该是列表或元组
# 绑定User模型到UserAdmin管理后台
admin.site.register(User, UserAdmin)
# 绑定Article模型到UserAdmin管理后台
admin.site.register(Article, ArticleAdmin)博主在代码运行后报RuntimeError: populate() isn't reentrant的错误,是因为Django导入包的逻辑和PyCharm的导入包的逻辑不一样。上述代码在PyCharm中报错,但是运行时无问题。
当导入模型是这个时则报错:
from models import User, Article。当导入模型是这个时则不报错:
from .models import User, Article、from article.models import User, Article。
配置完成后运行服务器,访问127.0.0.1/admin,可以看到后台多了一个ARTICLE管理,下面有Users和Articles两个模型。

选中一个模型,可以实现对模型的增删改查操作,如单击Articles模型的Add按钮,即可执行新增文章的操作。

在文章编辑页面中,会显示User选项,以为User和Article是一对多的关系,User选项的出现就是为了选择文章是谁写的。在创建数据模型时使用models.ForeignKey(User, on_delete.models.CASCADE)就指定了这种关系。
路由
Django处理路由的流程如下:
- 查找全局urlpatterns变量,即blog/url.py文件中定义的urlpatterns变量。
- 按照先后顺序,对URL逐一匹配urlpatterns中的每个元素。
- 找到第一个匹配时停止查找,根据匹配元素执行对应的处理函数。
- 若没有匹配或出现异常,Django会进行错误处理。