接上一节
新增了一个模型字段
并执行迁移后
python
python3 manage.py makemigrations
python3 manage.py migrate
这样我们就可以看到后台页面就会多出一个'用户类型'的下拉选项
因为这边的用户类型2是添加了editable=False 所以默认是不显示的 但在数据库中我们是可以看到这个字段的
modles的基本操作
一般的数据库操作流程!
1.创建数据库,设计表结构和字段
2.连接Mysql数据库,并编写数据访问层代码
3.业务逻辑层去调用数据访问层执行数据库操作
Django通过Model操作数据库,不管你数据库的类型是MySq1或者Sqlite,Django自动帮你生成相应数据库类型的Django帮我们自动完成。只要会写Model就可以了。SQL语句,所以不需要关注SQL语句和类型,对数据的操作apping,简称ORM)框架去操控数据库。
django使用对象关系映射(0bject Relational M:是一种程序技术,用于实现面向对象编程语言里不同类型系
ORM(0bject Relational Mapping)对象关系映射统的数据之间的转换。
增删改查
#ORM:
模型<=>表
类结构 ->表结构
对象->表的一条数据
类属性->表的字段
models基本操作
#增:
1)创建对象实例,然后调用save方法:
obj = Author()
obj.first_name ='zhang'
obj.last_name ='san'
obj.save()
2)创建对象并初始化,再调用save方法:
obj = Author(first_name='zhang', last_name='san')
obj.save()
3)使用create方法
Author.objects.create(first_name='li', last_name='si')
4)使用get_or_create方法,可以防止重复
Author.objects.get_or_create(first name='zhang', last name='san')
新增一个模型类 创建一个表
注意 需要数据迁移
如果models.py文件有变动,需要重新迁移
生成迁移文件:python manage.py makemigrations
执行迁移文件:python manage.py migrate
ORM 对象关系映射
模型类 => 表结构
类属性 => 表字段
一个对象 => 表的一行记录
在views.py 增加视图函数
python
# 增加函数
def add_person(request):
# 方式1
p = PersonModel()
p.name = "zhangsan"
p.age = 20
p.save() # 同步数据到数据库
return HttpResponse("增加成功")
增加一个urls
python
path("add/", add_person), # 添加数据
我们可以看到数据库中成功增加了一条数据
在创建的时候我们设置了unique=True 再次执行同一个名字增加到数据库的时候会报错
可以增加一个try
python
# 方式2
try:
p = PersonModel(name="王五", age=33)
p.save() # 同步数据到数据库
except Exception as e:
return HttpResponse(f"增加失败:{e}")
return HttpResponse("增加成功")
python
# 方式3
try:
PersonModel.objects.create(name="刘德华", age=60)
except Exception as e:
return HttpResponse(f"增加失败:名字已存在")
return HttpResponse("增加成功")
python
# 方式4
try:
ret = PersonModel.objects.get_or_create(name="张学友", age=60)
print("ret:", ret)
except Exception as e:
return HttpResponse(f"增加失败:名字已存在")
return HttpResponse("增加成功")
ret: (<PersonModel: PersonModel object (5)>, True)
[07/May/2024 11:03:27] "GET /add/ HTTP/1.1" 200 12
第一次创建就是True 如果已经存在会显示Flase
python
# 添加多条数据
for i in range(10, 21):
PersonModel.objects.create(name=f"张{i}峰", age=i)
return HttpResponse("增加成功")
删除数据
删除第一条数据
python
# 删除数据
def del_person(request):
# 删除数据
# 1.先找到要删除的数据
# 2.然后删除
try:
p = PersonModel.objects.first() # 第一条数据
p.delete() # 删除数据
except Exception as e:
return HttpResponse(f"删除失败:{e}")
return HttpResponse("删除成功")
删除多条数据
python
PersonModel.objects.filter(age__gt=50).delete() # 删除age大于50的数据
修改数据
python
# 修改数据
def update_person(request):
# 先找到修改的数据
# 然后修改数据
try:
p = PersonModel.objects.first() # 第一条数据
p.age = 666
p.save() # 同步数据到数据库
except Exception as e:
return HttpResponse(f"修改失败:{e}")
return HttpResponse("修改成功")
修改多条数据 举例把所有数据的age 修改为100
python
PersonModel.objects.all().update(age=100)
也可以指定修改某一条数据
python
p = PersonModel.objects.first() # 第一条数据
p.age = 666
p.save(update_fields=["age"])
查询数据
get():获取单条数据:
Author.objects.get(id=123)
如果没有找到符合条件的对象,会引发模型类.DoesNotExist异常
如果找到多个,会引发模型类.Multiple0bjectsReturned 异常
first():返回查询集(QuerySet)中的第一个对象
last():返回查询集中的最后一个对象
count():返回当前查询集中的对象个数
exists():判断查询集中是否有数据,如果有数据返回True没有反之
all():获取全部数据:
Author.objects.all()
values():获取指定列的值,可以传多个参数!返回包含字典的列表(保存了字段名和对应的值)
Author.objects.all().values('password')
values_list():获取指定列的值,可以传多个参数!返回包含元组列表(只保存值)
Author.objects.all().values_list('password')
进阶操作:
#获取个数
Author.obfects.filter(name='seven').count()
Author.objects.filter(id__gt=1) #获取id大于1的值
select * from Author where id>1
Author.objects.filter(id__gte=1) #获取id大于或等于1的值
select * from Author where id >=1
Author.objects.filter(id__lt=10) # 获取id小于10的值
select * from Author where id< 10
Author.objects.filter(id__lte=10)#获取id小于或等于10的值
select * from Author where id <= 10
Author.objects.filter(id__lt=10,id__gt=1) #获取id大于1 且 小于18的值
select * from Author where id < 10 and id>1
Author.objects.filter(id__in=[11,22,33]) #获取id在11、22、33中的数据
select * from Author where id in(11,22,33)
Author.objects.exclude(id__in=[11,22,33]) # not in
select * from Author where id not in(11,22,33)
Author.objects,filter(name__contains="ven") # contains(和数据库中like语法相同)
select * from Author where name like '%ven%"
Author.objects.filter(name icontains="ven")# icontains大小写不敏感
Author.objects.filter(nameAuthor.objects.filter(name_regex="^ven")# 正则匹配
Author.objects.filter(nameAuthor.objects.filter(name_iregex="^ven")# 正则匹配忽略大小写 Author.objects.filter(age__range=[10,20])#范围bettwen and
startswith,istartswith,endswith,iendswith:
#以什么开始,以什么结束,和上面一样带i的是大小写不敏感的,其实不带i的也忽略大小写
Author.objects.filter(name='seven').order_by('id')# asc升序 Author.objects.filter(name='seven').order_by('-id')# desc降序
Author.objects.all()[10:20 # 切片,取所有数据的10条到20条,分页的时候用的到
#手动分页
page 页码
per_page 每页数量 =5
第1页(page=1):0-4 =>[0:5]
第2页(page=2):5-9 =>[5:10]
]第3页(page=3):10-14 =>[10:15]
第4页(page=4):15-19 =>[15:20]
每一页数据范围
[(page-1)*per_page: page*per_page]
聚合
使用aggregate()函数返回聚合函数的值
Avg:平均值
Count:数量
Max:最大
Min:最小
Sum:求和
python
from django.db.models import Count,Min,Max,Sum
Author.objects.aggregate(Max('age'))
查询数据的内容比较多下一节再进行详细演示