1创建新项目的准备工作
1.1命令框内创建新项目
打开指定文件夹,在路径位置输入cmd打开命令行
django-admin startproject 项目名 创建项目
1.2在新项目内创建子应用
python manage.py startapp 子应用名
1.3注册子应用
在settings.py文件内注册子应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'创建的子应用名' #注册子应用
]
1.4配置模板
在settings.py文件内配置模板
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 配置模板路径,在根目录创建一个文件夹
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
1.5配置数据库
在settings.py文件内
# 配置数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 使用mysql数据库
'HOST': 'localhost', # 主机
'PORT': 3306, # 端口
'USER': 'root', # 数据库的用户名
'PASSWORD': '密码', # 数据库的密码
'NAME': '创建的数据库名', # 数据库的名字
}
}
1.6修改语言和时区
在settings.py文件内
LANGUAGE_CODE = 'zh-Hans' #语言
TIME_ZONE = 'Asia/Shanghai' #时区
1.7配置静态文件
在settings.py文件内
# 配置静态资源(现在基本上用不到)
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')] #配置路径,在根目录创建文件夹
1.8常用的mysql代码语句
查看所有数据库: show databases;
创建数据库: create database 数据名 charset=utf8;
删除数据库: drop database 数据库名;
调用数据库: use 数据库名;
查看数据库下的所有表: show tables;
查看表结构: desc 表名;
查看表中的所有数据: select * from 表名;
1.9安装数据库
在跟项目名同名的文件夹内init.py文件里安装
import pymysql
pymysql.install_as_MySQLdb()
1.9.1创建模型类
在子应用文件夹里的models.py创建
# 模型类 会自动生成 id字段
from django.db import models
class BookInfo(models.Model):
# 书名、发布日期、阅读量、评论量、售空
# 书名 字符串类型 max_length=20最大长度为20
name = models.CharField(max_length=20, verbose_name='书名')
# 发布日期 日期类型 null=True允许为空
pub_date = models.DateField(null=True, verbose_name='发布日期')
# 阅读量 整形 default=0默认为0
read_count = models.IntegerField(default=0, verbose_name='阅读量')
# 评论量 整形 default=0默认为0
comment_count = models.IntegerField(default=0, verbose_name='评论量')
# 售空 布尔类型 default=False默认为假
sale_out = models.BooleanField(default=False, verbose_name='售空')
class Meta:
db_table = 'bookinfo' # 指明数据库表名,如果不设置会叫books_BookInfo
verbose_name = '书籍信息表' # 在admin站点中显示的名称
verbose_name_plural = verbose_name# 在admin站点中显示的名称复数
def __str__(self):
"""定义每个数据对象的显示信息"""
return self.name
# 准备人物列表信息的模型类
class PeopleInfo(models.Model):
GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
name = models.CharField(max_length=20, verbose_name='名称')
gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
book = models.ForeignKey(bookinfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'peopleinfo'
verbose_name = '人物信息'
verbose_name_plural=verbose_name
def __str__(self):
return self.name
字段类型
类型 | 说明 |
---|---|
BooleanField | 布尔字段,值为True或False |
CharField | 字符串,参数max_length表示最大字符个数 |
TextField | 大文本字段,一般超过4000个字符时使用 |
IntegerField | 整数 |
DecimalField | 十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数 |
FloatField | 浮点数 |
DateField | 日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误 |
TimeField | 时间,参数同DateField |
DateTimeField | 日期时间,参数同DateField |
FileField | 上传文件字段 |
ImageField | 继承于FileField,对上传的内容进行校验,确保是有效的图片 |
选项
选项 | 说明 |
---|---|
null | 如果为True,表示允许为空,默认值是False |
blank | 如果为True,则该字段允许为空白,默认值是False |
db_column | 字段的名称,如果未指定,则使用属性的名称 |
db_index | 若值为True, 则在表中会为此字段创建索引,默认值是False |
default | 默认 |
primary_key | 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用 |
unique | 如果为True, 这个字段在表中必须有唯一值,默认值是False |
verbose_name | 对于字段的一个可读性更高的名称 |
null是数据库范畴的概念,blank是表单验证范畴的
6 外键
在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:
- CASCADE级联,删除主表数据时连通一起删除外键表中数据
- PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
- SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
- SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
1.9.2创建好模型类后进行迁移
在项目内终端执行
生成迁移文件:python manage.py makemigrations
执行迁移:python manage.py migrate
如果迁移出错,把数据库删了创建新的数据库,生成的迁移文件也删了,重新执行上面2个步骤
1.9.3创建超级用户
创建超级用户 (python终端内运行)
python manage.py createsuperuser
电子邮件地址直接回车跳过
(前后密码要一致)
如果出现cryptography报错就python终端内安装
pip install cryptography
2.在子应用的admin.py文件中添加代码,注册表,不然admin控制台没办法管理这个表
from django.contrib import admin
#导包
from myapp.models import BookInfo #models.py文件内创建的模型类名
# Register your models here.
admin.site.register(BookInfo)
3.运行项目,在admin页面添加数据
2 添加测试数据
在mysql里添加测试数据
也可以在admin管理员页面进行添加
insert into bookinfo(name, pub_date, read_count,comment_count, sale_out) values
('射雕英雄传', '1980-5-1', 12, 34, 0),
('天龙八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飞狐', '1987-11-11', 58, 24, 0);
######################################
insert into peopleinfo(name, gender, book_id, description, is_delete) values
('郭靖', 1, 1, '降龙十八掌', 0),
('黄蓉', 0, 1, '打狗棍法', 0),
('黄药师', 1, 1, '弹指神通', 0),
('欧阳锋', 1, 1, '蛤蟆功', 0),
('梅超风', 0, 1, '九阴白骨爪', 0),
('乔峰', 1, 2, '降龙十八掌', 0),
('段誉', 1, 2, '六脉神剑', 0),
('虚竹', 1, 2, '天山六阳掌', 0),
('王语嫣', 0, 2, '神仙姐姐', 0),
('令狐冲', 1, 3, '独孤九剑', 0),
('任盈盈', 0, 3, '弹琴', 0),
('岳不群', 1, 3, '华山剑法', 0),
('东方不败', 0, 3, '葵花宝典', 0),
('胡斐', 1, 4, '胡家刀法', 0),
('苗若兰', 0, 4, '黄衣', 0),
('程灵素', 0, 4, '医术', 0),
('袁紫衣', 0, 4, '六合拳', 0);
2.1shell工具
Django的manage工具提供了shell命令,帮助我们配置好当前工程的运行环境(如连接好数据库等),以便可以直接在终端中执行测试python语句。
通过如下命令进入shell
python manage.py shell
2.2数据库操作-增、删、改
在shell里一定要导包,只在python里边导包是没用的
2.21增加
#新增数据
# 方式一
bookinfo.objects.create(
name='python',
pub_date='2022-02-22',
read_count=500,
comment_count=200,
)
#方式二
book=bookinfo(
name='python高级',
pub_date='2022-04-22',
read_count=200,
comment_count=100,
)
book.save()
2.23修改
# 方式1
bookinfo.objects.filter(name='python').update(sale_out=True)
#方式2
book=bookinfo.objects.get(name='python高级') # 获取对象
book.read_count=222 #200改成222 修改属性值
book.save() # 保存生效
2.24删除
#删除
#方式1
bookinfo.objects.filter(name='python').delete()
#方式2
book=bookinfo.objects.get(name='python高级')
book.delete()
2.3查询
2.31. 基本查询
get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。
all查询多个结果。
count查询结果数量。
2.32.过滤查询
实现SQL中的where功能,包括
- filter过滤出多个结果
- exclude排除掉符合条件剩下的结果
- get过滤单一结果
2.33. 聚合函数
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg平均,Count数量,Max最大,Min最小,Sum求和,被定义在django.db.models中。
2.34.排序
使用order_by对结果(QuerySet)进行排序
2.35.练习题
# 查看全部数据
bookinfo.objects.all()
#查询数据量
bookinfo.objects.count()
#查询名字为‘射雕英雄传的数据
book=bookinfo.objects.get(name='射雕英雄传')
#过滤
book=bookinfo.objects.filter(name='射雕英雄传')
# 查询编号为1的图书
##book=可以不用写 如果写了运行完代码还要再输入book运行才能出现结果
book=bookinfo.objects.get(id=1)
book=bookinfo.objects.get(id__exact=1)
# 查询书名包含'湖'的图书 i区分大小写
book=bookinfo.objects.filter(name__contains='湖')
# 查询书名以'部'结尾的图书
book=bookinfo.objects.filter(name__endswith='部')
# 查询书名为空的图书
book=bookinfo.objects.filter(name__isnull=True)
# 查询编号为1或3或5的图书
bookinfo.objects.filter(id__in=[1,3,5])
# 查询编号大于3的图书
############gt大于 gte大于等于 lt小于 lte小于等于
bookinfo.objects.filter(id__gt=3)
# 查询1980年发表的图书
bookinfo.objects.filter(pub_date__year=1980)
# 查询1990年1月1日后发表的图书
bookinfo.objects.filter(pub_date__gt='1990-01-01')
#F查询和Q查询
# 查询阅读量大于等于评论量的图书。
from django.db.models import F #导包
bookinfo.objects.filter(read_count__gte=F('comment_count'))
# 查询阅读量大于2倍评论量的图书。
bookinfo.objects.filter(read_count__gte=F('comment_count')*2)
#Q查询
# 查询阅读量大于20,并且编号小于3的图书。
from django.db.models import Q #导包
bookinfo.objects.filter(read_count__gt=20,id__lt=3)
bookinfo.objects.filter(read_count__gt=20).filter(id__lt=3)
bookinfo.objects.filter(Q(read_count__gt=20) & Q(id__lt=3))
# 查询阅读量大于20,或编号小于3的图书。
bookinfo.objects.filter(Q(read_count__gt=20) | Q(id__lt=3))
# 查询编号不等于3的图书。
#####exclude():返回满足条件之外的数据。
bookinfo.objects.exclude(id=3)
bookinfo.objects.filter(~Q(id=3))
#聚合函数
from django.db.models import Sum,Max,Min,Avg,Count #导包
# 查询图书的总阅读量。
bookinfo.objects.aggregate(Sum('read_count'))
# 查询图书总数。
bookinfo.objects.count()
bookinfo.objects.aggregate(Count('id'))
#
# 查询所有书籍信息平按照阅读量排序。
bookinfo.objects.all().order_by('read_count') # 升序
bookinfo.objects.all().order_by('-read_count') # 降序
# 查询id小于等于3的书籍,并按照评论量升序排序
books = bookinfo.objects.filter(id__lte=3).order_by('comment_count')
###
# 联表查询练习:
from books.models import bookinfo,PeopleInfo
book=bookinfo.objects.get(id=1)
book.peopleinfo_set.all()
PeopleInfo.objects.filter(book_id=1)
# 查询人物为1的书籍信息
people=PeopleInfo.objects.get(id=1)
people.book
book=bookinfo.objects.filter(peopleinfo__id=1)
# 查询图书,要求图书人物为"郭靖"
bookinfo.objects.filter(peopleinfo__name='郭靖')
# 查询图书,要求图书中人物的描述包含"八"
bookinfo.objects.filter(peopleinfo__description__contains='八')
# 查询书名为“天龙八部”的所有人物
PeopleInfo.objects.filter(book__name='天龙八部')
# 查询图书阅读量大于30的所有人物
PeopleInfo.objects.filter(book__comment_count__gt=30)
2.36.查询集QuerySet
Django的ORM中存在查询集的概念。
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
-
all():返回所有数据。
-
filter():返回满足条件的数据。
-
exclude():返回满足条件之外的数据。
-
order_by():对结果进行排序。
对查询集可以再次调用过滤器进行过滤
从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子句。
3.一对一关系
3.1 一对一关系是什么
模型类使用
OneToOneField
用来定义一对一关系;
比如当你拥有一个老师表时,紧接着你还需要一个教授表,那么教授表可能拥有老师表的一系列属性,那么你还不想把老师表中的字段直接复制到教授表那么可以通过OnToOneField
来实现教授表继承老师表
4多对多关系
4.1 什么是多对多关系
多对多关系在模型中使用
ManyToManyField
字段定义
多对多关系可以是具有关联,也可以是没有关联,所以不需要明确指定on_delete
属性
生活中,多对多关系:一个乐队可以有很多音乐家,一个音乐家也可以隶属好多个乐队一个文章中可以有很多标签,一个标签也可出现在很多文章中在多对多关系中专门有第三张表来存储对应关系,表本身之间没有任何关联,此时删除和修改数据不影响另外一张表from