- 配置数据库
settings.py
DATABASES = {
'default':{
'ENGINE':'数据库引擎',
'NAME':'数据库名',
'USER':'用户名',
'PASSWORD':'密码',
'HOST':'主机',
'PORT':'端口',
}
}
指令:
1.python3 manage.py makemigrations
将Models类生成中间文件
2.python3 manage.py migrate
将中间文件映射回数据库
- Models 语法
- 语法
class CLASSNAME(models.Model):
NAME=models.FIELD_TYPE(FIELDOPTIONS)
1.CLASSNAME:实体类名,表名的组成规范
2.NAME:属性名,列名
3.FIELD_TYPE : 字段类型
1.BooleanField()
2.CharField(max_length=xxx)
3.DateField()
4.DateTimeField()
5.DecimalField(max_digits=x,decimal_places=x)
6.FloatField()
7.EmailField()
8.IntegerField()
9.ImageField()
10.TextField()
4.FIELDOPTIONS
1.primary_key : True 表示主键
2.null : True 表示允许为空
3.default : 指定默认值
4.db_index : True 表示添加索引
5.db_column : 指定列名
6.unique : True 表示唯一
2.指令
python3 manage.py inspectdb > 文件名.py
- CRUD
- 增加数据
- Entry.objects.create(xx=xx,xx=xx)
返回值:返回创建好的实体对象 - 创建Entry对象,并调用save()
obj = Entry(xx=xx)
obj.xx = xx
obj.save() - 通过字典构建对象
obj = Entry(**dic)
obj.save()
- Entry.objects.create(xx=xx,xx=xx)
- 查询数据
通过 Entry.objects 属性调用查询接口- Entry.objects.all()
QuerySet : 将实体对象封装到列表中 - Entry.objects.values(‘列1’,‘列2’)
作用:查询返回部分列的值
返回:QuerySet , 将查询数据封装到字典中再封装到列表中 - Entry.objects.values_list(‘列1’,‘列2’)
返回:QuerySet , 将查询数据封装到元组总再封装到列表中 - Entry.objects.order_by(“列1”,"-列2")
Entry.objects.all().order_by().value_list()
===================================================
- Entry.objects.all()
- 增加数据
模型
- CRUD
-
增加数据(略)
-
查询
- 根据条件查询部分数据
方法:filter(条件)
语法:Entry.objects.filter(条件)
返回值:QuerySet- 示例:
- 查询Author实体中id为1的信息
authors=Author.objects.filter(id=1) - 查询Author实体中id为1并且isActive为True的
authors=Author.objects.filter(id=1,isActive=True)
- 查询Author实体中id为1的信息
- 非等值条件的构建,需要使用查询谓词(Field Lookup)
- 查询谓词:每一个查询谓词是一个独立的查询功能
语法: xxx.filter(属性__查询谓词=值)-
__exact : 等值匹配
Author.objects.filter(id__exact=1)
select * from author where id = 1 -
__contains : 包含指定值
Author.objects.filter(name__contains=‘w’)
select * from author where name like ‘%w%’ -
__gt : 大于指定值
Author.objects.filer(age__gt=50)
select * from author where age > 50 -
__gte :
-
__lt :
-
__lte :
-
__in:查找数据是否在指定范围内
Publisher.objects.filter(country__in=[‘中国’,‘日本’,‘韩国’])select * from publisher where country in (‘中国’,‘日本’,‘韩国’)
-
__range:查找数据是否在指定的区间范围内
Author.objects.filter(age__range=(35,50))
- 练习:
- 查询Author表中age大于等于85的信息
Author.objects.filter(age__gte=85) - 查询Author表中姓巴的人的信息
Author.objects.filter(name__startswith=‘巴’) - 查询Author表中Email中包含in的人的信息
Author.objects.filter(email__contains=‘in’) - 查询Author表中Age大于"巴金"的age的信息
- 查询Author表中age大于等于85的信息
-
- 查询谓词:每一个查询谓词是一个独立的查询功能
- 示例:
- 不等的条件筛选
语法:exclude(条件)
用法:Entry.objects.exclude(条件) - 查询只返回一条数据
语法:get(条件)
语法:Entry.objects.get()
注意:
该方法只能返回一条数据
查询结果多余一条数据的话,则抛异常
查询结果如果没有数据的话,则抛异常 - 聚合查询
- 不带分组
语法:aggregate()
用法:Entry.objects.aggregate(名=聚合函数(‘列’))
聚合函数:
from django.db.models import Sum,Avg,Count,Max,Min - 带分组
语法:annotate()
用法:
Entry.objects
.values(‘分组列名’,‘分组列名’)
.annotate(名=聚合函数(‘列’))
.values(‘查询列名’)
- 不带分组
- 根据条件查询部分数据
-
修改
- 修改单个实体
- 查
通过 get() 得到要修改的实体对象 - 改
通过 对象.属性 的方式修改数据 - 保存
通过 对象.save() 保存数据
- 查
- 修改QuerySet
直接调用QuerySet的update(属性=值) 实现批量修改
- 修改单个实体
-
删除
删除单个对象/查询结果集 都是调用 delete()
1.删除单个对象
Author.objects.get(id=1).delete()- 删除查询结果集
Author.objects.filter(isActive=False).delete()
- 删除查询结果集
-
- F查询 和 Q查询
- F查询 - F()
- 作用
在执行过程中获取某列的值 - 语法:
from django.db.models import F
F(‘列名’) - 示例
更新Author实体中所有的数据的age+10
Author.objects.all().update(age=F(‘age’)+10)
- 作用
- Q查询 - Q()
1.作用
在条件中用来实现 or 的操作- 语法
from django.db.models import Q
Q(条件1)|Q(条件2) - 示例
查询Author表中id=1或age>=80的人的信息
Author.objects.filter(Q(id=1)|Q(age__gte=80))
- 语法
- F查询 - F()
- 原生的数据库操作方法
- 查询
- 语法
raw(sql语句) - 用法
Entry.objects.raw(‘sql语句’) - 返回值
QuerySet
- 语法
- 增删改
- 查询
from django.db import connection
def doSQL():
#更新index_author表中所有的数据的isActive=1
with connection.cursor() as cursor:
cursor.execute('update index_author set isActive=1')
return HttpResponse('xxx')
- 使用后台管理models
- 后台的配置
登录地址:http://localhost:8000/admin
使用指令创建后台管理员:
python3 manage.py createsuperuser - 基本的数据管理
-
在应用中的admin.py中注册要管理的实体类
- admin.py
作用:注册要管理的models类 - 注册Models
from django.contrib import admin
from .models import *
admin.site.register(Entry)
admin.site.register(Entry)
- admin.py
-
定义Models的展现形式
- 通过实体类的 str() 定义展现名称
classd Author(models.Model):
xxx xxx
def str(self):
return self.name- 通过 verbose_name 字段选项,修改名称
name = models.CharField(
max_length = 30,
verbose_name=‘姓名’
) - 通过Meta内部类 修改展现形式
class Author(models.Model):
xxx xxx
class Meta:
1.db_table
指定当前类映射到的表名
(设置完成后立马同步数据库)
2.verbose_name
定义实体类在后台的名称(单数)
3.verbose_name_plural
效果同上(复数)- 练习:
- 修改 Publisher 的后台显示
- 更改表名为 publisher
- 修改后台展示名称为 - 出版社
- 修改每个属性对应的中文名
- 修改 Book 后台显示
- 更改表名为 book
- 修改后台展示名称 - 书籍
- 修改每个属性对应的中文名
- 修改 Publisher 的后台显示
-
- 后台的配置
- 高级的数据管理
-
在 admin.py 中创建高级管理类并注册
- 声明高级管理类
class EntryAdmin(admin.ModelAdmin):
pass - 注册高级管理类
admin.site.register(Entry,EntryAdmin)
- 声明高级管理类
-
练习
为 Publisher 增加高级管理功能
1.在列表页中显示 name,address,city 属性
2.在列表页中 address 和 city 是可编辑的
3.右侧增加过滤器 , 允许按照city筛选
4.顶部增加搜索框,允许按照name和website搜索
5.详情页中分组显示:
1.name,address,city 基本信息
2.country,website 高级信息,可折叠
-