1. 准备工作
1.1 创建项目
- 打开项目的文件夹 - 输入cmd
- 创建项目
django-admin startproject 项目名
- 创建子应用
python manage.py startapp 子应用名
1.2 配置相关信息
在settings.py 中进行配置
# 注册子应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'books', # 注册子应用
]
# 配置模板
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',
],
},
},
]
# 配置数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST':'localhost',
'POST':3306,
'USER':'root',
'PASSWORD':'123123',
'NAME':'book', # 数据库
}
}
# 配置汉字,时区
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
1.3 安装数据库
在与项目名的同文件的**init.py**
import pymysql
pymysql.install_as_MySQLdb() # 安装数据库
2.模型类字段
2.1 模型类字段类型
类型 | 说明 | 表单类型 |
---|---|---|
BooleanField | 布尔类型,值为True/False | CheckboxInput,<input type=‘checkbox’ …> |
CharField | 字符串,参数必须有max_length(表示最大字符格式) | TextInput,<input type=“text” …> |
TextField | 大文本字段,一般超过4000个字符时使用 | |
IntegerField | 整数 | |
DecimalField | 十进制浮点数,更准确,参数max_digits表示总位数,参数decimal_places表示小数位数 | TextInput,<input type=“text” …> |
FloatField | 浮点数 | TextInput,<input type=“text” …> |
DateField | 日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误 | TextInput,<input type=“text” …> |
TimeField | 时间,参数同DateField | |
DateTimeField | 日期时间,参数同DateField | |
FileField | 上传文件字段 |
2.2 字段属性
选项 | 说明 |
---|---|
null | 如果为True,表示允许为空,默认时False,数据库 |
blank | 如果为True,则该字段允许为空白,默认值是False,表单验证 |
db_column | 字段的名称,如果未指定,则使用属性的名称 |
db_index | 若值为True, 则在表中会为此字段创建索引,默认值是False |
default | 默认 |
primary_key | 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用 |
unique | 如果为True, 这个字段在表中必须有唯一值,默认值是False |
verbose | 对于字段的一个可读性更高的名称 |
2.3 外键
在设置外键时,需通过on_delete选项指明主表删除数据时,对于外键
引用表数据如何处理在django.db.models中包含了可选常量:
- CASCADE级联,删除主表数据时连通一起删除外键表中数据
- PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
- SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
- SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
2.4 创建图书模型类:
# 书籍模型类
class Bookinfo(models.Model):
name = models.CharField(max_length=20,verbose_name='书名')# 书名
# 日期类型
pub_date = models.DateField(null=True,verbose_name='发布日期')
read_count = models.IntegerField(default=0,verbose_name='阅读量')
comment_count = models.IntegerField(default=0,verbose_name='评论量')
# 布尔类型
sale_out = models.BooleanField(default=False,verbose_name='售空')
# 元类
class Meta:
verbose_name = '书籍信息表' # 在admin页面表的名字(单数)
verbose_name_plural = verbose_name # 在admin页面表的名字(复数)
db_table = 'bookinfo' # 在数据库中的表名
def __str__(self): # 直接输出对象时,输出对象名
return self.name
1)数据库表名
模型类未指表名,默认以子应用名+模型类名未数据库名,可通过db_table指明数据库表名,在元类中写
2)关于在admin表名
为指明表名,默认为模型名,可通过verbose_name设置admin页面表名(单数),verbose_name_plural设置admin页面表名复数
3)关于主键
django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。默认创建的主键列属性为id。
4)属性命名限制
- 不能时关键字
- 不允许连续使用下划线
- 定义属性需要指定字段类型:
属性=models.字段类型(选项)
3.迁移
1)注册表
from django.contrib import admin
from books.models import Bookinfo
# Register your models here.
admin.site.register(Bookinfo)
2)执行迁移
python manage.py makemigrations
python manage.py migrate
3)创建超级用户
python manage.py createsuperuser
4. 添加测试数据
在数据库中
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);
5.Shell工具
进入python语句,配置的Django环境
python manage.py shell
6. 增删改查
注:进行时把模板导入from books.models import Bookinfo
6.1 增加
方法一:create
Bookinfo.objects.create(
name= 'python',
pub_date= '2022-02-22',
read_count= 500,
comment_count= 200,
)
方法二:save
book = Bookinfo(
name= 'python高阶',
pub_date= '2022-02-25',
read_count= 600,
comment_count= 200,
)
book.save()
6.2 修改
方法一:update
Bookinfo.objects.filter(name='python').update(sale_out=True)
方法二:save
book = Bookinfo.objects.get(name='python高阶')
book.read_count = 650
book.save()
6.3 删除
方法一:delete
Bookinfo.objects.filter(name='python').delete()
方法二:
book = Bookinfo.objects.get(name='python高阶')
book.delete()
7.查询
1.基本查询
- get查询结果单一,不存在会抛出模型类.DoesNotExist异常
- all查询多个结果
- count查询数量
2.过滤查询
- filter过滤,结果是数组
- exclude排除符合条件,数组
- get过滤单一结果
3.聚合函数
使用聚合函数先导包from django.db.models import Sum,Max,Min,Avg,Count
用**aggregate()**过滤器调用聚合函数
聚合函数包括:Avg平均、Sum求和、Count数量、Max最大、Min最小
4.排序
order_by()进行排序
5.案例
Bookinfo.objects.get(name='射雕英雄传') # 精准找到一条数据
Bookinfo.objects.filter(name='射雕英雄传') # 过滤的数组
# 查询编号为1的图书
Bookinfo.objects.get(id=1)
Bookinfo.objects.get(id__exact=1) # 精准于上面效果一样
# 查询书名包含'湖'的图书
# 字段名__条件
book = Bookinfo.objects.filter(name__contains='湖') # __contaions包含
# 查询书名以'部'结尾的图书
book = Bookinfo.objects.filter(name__endswith='部') # __endswith以什么结尾
# 查询书名为空的图书
book = Bookinfo.objects.filter(name__isnull=True)
# 查询编号为1或3或5的图书
Bookinfo.objects.filter(id__in=[1,3,5]) # in范围
# 查询编号大于3的图书
Bookinfo.objects.filter(id__gt=3) # gt 大于 gte大于等于 lt小于 lte小于等于
# 查询1980年发表的图书
Bookinfo.objects.filter(pub_date__year=1980)
# 查询1990年1月1日后发表的图书
Bookinfo.objects.filter(pub_date__gt='1990-01-01')
# 查询阅读量大于等于评论量的图书。
from django.db.models import F
Bookinfo.objects.filter(read_count__gte=F('comment_count')) # F查询是字段与字段比较
# 查询阅读量大于2倍评论量的图书。
Bookinfo.objects.filter(read_count__gt=F('comment_count')*2)
# 查询阅读量大于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的图书。
Bookinfo.objects.exclude(id=3) # exclude 排除
Bookinfo.objects.filter(~Q(id=3))
# 查询图书的总阅读量。
from django.db.models import Sum,Max,Min,Avg,Count
Bookinfo.objects.aggregate(Sum('read_count')) # aggregate 调用聚合函数
# 查询图书总数。
Bookinfo.objects.count() # 整型
Bookinfo.objects.aggregate(Count('id')) # 字典
# 查询所有书籍信息平按照阅读量排序。
Bookinfo.objects.all().order_by('read_count') # order_by排序默认升序
Bookinfo.objects.all().order_by('-read_count') # 降序
8 查询集QuerySet
表示从数据库中获取的对象集合
下面调用过滤器方法,会返回查询集(不是简单的列表):
- all():返回所有数据
- filter():返回满足条件的数据
- exclude():返回满足条件之外的数据
- order_by():对结果排序
对查询集可以再次调用过滤器进行过滤
从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子句