前言:本文是学习网易微专业的《python全栈工程师 - Django快速建站》课程的笔记,欢迎学习交流。同时感谢老师们的精彩传授!
一、课程目标
- 了解
Django
中模型的含义和作用 - 掌握迁移数据库的操作
- 掌握超级管理员的创建方法
- 掌握管理界面的配置方法
二、详情解读
2.1.模型
2.1.1.网页内容来源
- 静态:直接写到
HTML
文件中 - 动态:来自数据库。使用
SQL
语句读取数据库,Django
通过ORM
(Object-Relational Mapping
,对象关系映射)来实现对数据库的读写。
2.1.2.ORM
ORM
:在关系型数据库和业务实体对象之间创建映射关系。操作业务对象时,不需要使用SQL
语句,只需要操作对象的属性和方法。- 优点:可移植性强,安全性好,查询语法简单。
ORM
实现方法:
– 编写数据模型类
– 位置:models.py
(也可以是其他文件)
– 继承:django.db.models.Model
– 对应的数据库表:appname_modelname
,(都是小写字母)
– 创建数据库表:迁移操作,命令如下 :
python manage.py makemigrations
python manage.py migrate
实操:
在myproject/blog/models.py
文件中写入以下内容
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class BlogArticles(models.Model):
title = models.CharField(max_length=300)
author = models.ForeignKey(User, on_delete=models.CASCADE,related_name='blog_posts')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ('-publish', )
def __str__(self):
return self.title
示例解析:
2.1.3.字段
title = models.CharField(max_length=300)
- 模型中每一个字段都应该是某个
Field
类的实例,Django
利用这些字段类来实现以下功能:
– 字段类型用以指定数据库数据库类型(如:INTEGER
,VARCHAR
,TEXT
)。
– 在渲染表单字段时默认使用的HTML
视图(如:<input type="text">,<select>
)。
– 基本的有效性验证功能,用于Django
后台和自动生成的表单。
2.1.4.字段类型
- 内置的字段类型:https://docs.djangoproject.com/zh-hans/3.0/ref/models/fields/#model-field-types
这里列举常用的模型字段:
AutoField、BigAutoField、BigIntegerField、IntegerField、BinaryField、BooleanField、CharField、DateField、DateTimeField、DecimalField、DurationField、EmailField、FileField、FilePathField
更多内容请参考文章:Django模型系统的常用字段和字段参数
- 自定义字段类型
2.1.5.示例分析一:
- 字段选项:每个字段类型中需要指定一些特定的参数
title = models.CharField(max_length=300)
说明:
1).CharField
:表示字符类型
2).max_length
:数据库存储VARCHAR
数据时的字节最大长度
publish = models.DataTimeField(default=timezone.now)
说明:
1).DateTimeField
:表示日期时间类型
2).default
:默认指定的时间
body = models.TextField()
说明:TextField
表示文本类型
2.1.6.示例分析二:
from django.contrib.auth.models import User
class BlogArticles(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
ForeignKey
:外键,一对多(多对一)关系
说明:
1).User
:表示被关联的类
2).on_delete=models.CASCADE
:表示联级删除
3).related_name='blog_posts'
:表示User
的实例以blog_posts
属性反向查询到BlogArticles
的实例
在项目目录下,即myproject
目录下,运行命令:
# 第一步
python3 manage.py makemigrations
# 第二步
python3 manage.py migrate
运行结果:
2.1.5.迁移数据
- 迁移操作:
python manage.py makemigrations
python manage.py migrate
- 查看数据库表结构
– 可视化方法:https://sqlitestudio.pl/index.rvt
–sqlite
操作界面
2.2.管理功能
2.2.1.创建超级管理员
- 命令:
python manage.py createsuperuser
- 登录管理界面:管理界面对应一个专门的管理应用,
http://localhost:8000/admin/
2.2.2.添加管理内容
上面的后台管理界面只显示用户模块的内容,没有显示blog
的内容,进行下面的操作:
- 编辑
./blog/admin.py
文件,写入以下代码
from django.contrib import admin
from .models import BlogArticles
admin.site.register(BlogArticles)
保存上面代码,此时后台界面是这样的:
但Blog
部分的内容只显示文章的标题,右边大片空白:
为了在文章列表中显示更多的内容,继续编辑./blog/admin.py
文件,替换为以下代码:
from django.contrib import admin
from .models import BlogArticles
class BlogArticlesAdmin(admin.ModelAdmin):
# 要显示的字段
list_display = ('title', 'author', 'publish')
list_filter = ('publish', 'author')
search_fields = ('title', 'body')
raw_id_fields = ('author',)
date_hierarchy = 'publish'
ordering = ['-publish', 'author']
admin.site.register(BlogArticles, BlogArticlesAdmin)
修改后界面变化:
三、课程小结
- 01 创建模型
- 02 管理功能