12、 Django-模型models的基本操作-增删改查
一般的数据库操作流程:
1、创建数据库,设计表结构和字段
2、连接Mysq1数据库,并编写数据访问层代码
3.业务逻辑层去调用数据访问层执行数据库操作
Diango通过Mode1操作数据库,不管你数据库的类型是MySql或者Sqlite,
Django自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Diango帮我们自动完成。只要会写Mode1就可以了。
django使用对象关系映射(0bject Relational Mapping,简称ORM)框架去操控数据库。
ORM(0biect Relational Mapping)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
管理器:
自定义QuerySet的输出格式-就是返回输出模型类中的字段的格式:
#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='lo', last_name='si')
4、使用get_or_create方法、可以防止重复
Author.objects.get_or_create(first_name='zhang', last_name='san')
#如
models.py
------------------------------------------------------------------------
from django.db import models
#增删改查
class PersonModel(models.Model):
name = models.CharField(max_length=30, unique=True)
age = models.IntegerField(default=18)
#创建表
class Meta:
#表名
db_table = 'tb_person'
#将值打印出来、而不是显示模型对象 <PersonModel: PersonModel object (9)>
def __str__(self):
return f'{self.name} - {self.age}'
def __repr__(self):
return f'{self.name} - {self.age}'
#ORM : 对象关系映射
#模型类class --> 对应数据库中的--> 表结构
#类属性(name\age...) --> 对应数据库中的--> 表字段
#一个对象(在视图函数中操作) --> 对应数据库中的--> 表的一条数据
----------------------------------------------------------------------------------------------------
views.py
----------------------------------------------------------------------------------------
from django.shortcuts import render
from App_models.models import *
from django.http import HttpResponse
# Create your views here.
#增加数据
def add_person(request):
# #方式一:
# try:
# p = PersonModel()
# p.name = '阿新' #name字段设置成了unique 唯一性、不能重复新增
# p.age = 20
# p.save() #同步数据到数据库中
# except Exception as e:
# return HttpResponse('add False!!!')
# return HttpResponse('add successfully')
# 方式二:
# try:
# p = PersonModel(name='xjj', age=25) # name字段设置成了unique 唯一性、不能重复新增
# p.save() # 同步数据到数据库中
# except Exception as e:
# return HttpResponse('add False!!!')
# return HttpResponse('add successfully')
# # 方式三:
# try:
# PersonModel.objects.create(name='小新', age=22)
# except Exception as e:
# return HttpResponse('add False!!!')
# return HttpResponse('add successfully')
# 方式四:
# try:
# #PersonModel.objects.get_or_create 是有返回值的 True或False
# ret = PersonModel.objects.get_or_create(name='温工', age=22)
# print('ret:',ret) #ret: (<PersonModel: PersonModel object (5)>, False) 返回值
# except Exception as e:
# return HttpResponse('add False!!!')
# return HttpResponse('add successfully')
#批量增加for循环
for i in range(10, 20):
PersonModel.objects.create(name=f'吴{i}坊', age=i)
return HttpResponse('add successfully!')
---------------------------------------------------------------------------------------------------------------
根路由urls.py
--------------------------------------------------------------------------------
from django.contrib import admin
from django.urls import path
from App_models.views import *
urlpatterns = [
path('add/', add_person, name='addperson'),
path('admin/', admin.site.urls),
]
-------------------------------------------------------------------------
#删
views.py
----------------------------------------------------------------------------------------------------
def del_person(request):
#删除数据
#1、先找到要删除的数据
#2、再执行删除
try:
#删除一条数据
# p = PersonModel.objects.first() #表中的第一条数据
# p = PersonModel.objects.last() # 表中的最后一条数据
# p.delete()
#删除多条数据
#.filter 过滤
#age__gt=15 表示 age>15的数据
PersonModel.objects.filter(age__gt=15).delete() #删除age大于15的数据
except Exception as e:
return HttpResponse('删除失败')
return HttpResponse('删除成功')
#修改
views.py
------------------------------------------------------------------
#修改数据
def update_person(request):
#修改数据
#1、先找到要修改的数据
#2、再修改
try:
# 修改一条数据
p = PersonModel.objects.first() #找到第一条数据
p.age = 56
# p.save() #同步到数据库中
p.save(update_fields=['age']) #修改指定的字段、提高效率
# 修改多条数据
# PersonModel.objects.all().update(age=100) #将所有数据的age值改为100
except Exception as e:
return HttpResponse('修改失败')
return HttpResponse('修改成功')
#查
官网详细:https://docs.djangomroject.com/en/2.2/ref/models/querysets/#field-lookups
views.py
-----------------------------------------------------------------------------------------------
#查询 # print(persons.query) #返回sql语句
def get_person(request):
# #get():得到一个对象(一条数据) -- 放回object对象 不是QuerySet
# # 如果不存在id=6的数据、就会报错所以get()必须要指定已存在的数据:报错-模型类错误.DoesNotExist异常
# # 有且只能匹配一条数据、多条数据也会报错:报错模型类.MultipleObjectsReturned异常
# p = PersonModel.objects.get(id=6)
# p = PersonModel.objects.get(pk=6) #pk :primary key 主键 这样写也是可以的
#
# print('*' * 60)
# print(p, type(p)) #p为模型中的PersonModel对象
# print(p.name, p.age)
# print('*' * 60)
# all() 获取所有的数据(返回值是QuerySet-[<实例化的对象>]) == select * from table_name;
#返回一个查询集、可遍历
persons = PersonModel.objects.all()
print(persons, type(persons))
#遍历查询集
for person in persons:
print(person.name, person.age)
#values(字段名1, 字段名2, ...)-查询指定字段的数据(返回值-QuerySet[{字典},]) == select 字段名1, 字段名2 from table_name;
persons = PersonModel.objects.values('name', 'age')
for person in persons:
print(person['name'], person['age'])
#values_list(字段名1, 字段名2, ...)-查询指定字段的数据(返回值-QuerySet[(元组),])== select 字段名1, 字段名2 from table_name;
persons = PersonModel.objects.values('name', 'age')
for person in persons:
print(person[0]) #使用下标取值
#first() :第一条数据
f = PersonModel.objects.first()
print(f.name, f.age)
#last():最后一条数据
l = PersonModel.objects.last()
print(l.name, l.age)
#条件查询
#filter():过滤、常用
# 对应sql:select * from tb_person
filter_set = PersonModel.objects.filter() #默认不加条件、获取所有字段的数据
#对应sql:select * from tb_person where age > 100
filter_set = PersonModel.objects.filter(age__gt=100) #查询age>100的
filter_set = PersonModel.objects.filter(age__gte=100) # 查询age>=100的
filter_set = PersonModel.objects.filter(age__lt=100) # 查询age<100的
filter_set = PersonModel.objects.filter(age__lte=100) # 查询age<=100的
filter_set = PersonModel.objects.filter(age=100) # 查询age=100的
#查询集可以做链式调用
# print(filter_set.filter().filter().all().first())
for person in filter_set:
print('----', person.name, person.age)
print('-------------------------------------------')
print(filter_set.first())
print(filter_set.last())
print(filter_set.exists()) #查询集是否存在数据、如果存在则为True、否则为False
print(filter_set.count()) #查询集中的个数
print('-' * 60)
#values() 和 values_list()
filter_set = PersonModel.objects.filter() #查询全部数据
print(filter_set)
print(list(filter_set)) #将查询集强制转为列表
#values() :列表套字典、得到字段和值
print(filter_set.values()) #将查询集转为列表套字典[{},{}...]、一条数据为一个嵌套字典
print(filter_set.values('name', 'age')) # 将查询集转为列表套字典: 拿指定的 key的信息
#values_list(): 列表套元组、只得到值
print(filter_set.values_list('name', 'age')) #查询集转为列表套元组:只得到指定字段的值
print('-' * 60)
#filter(): 详细、类似数据库中的where语句
person = PersonModel.objects.filter(age__in=[100, 200, 110, 56]) #in
#exclude() :排除、取反的意思
person = PersonModel.objects.exclude(age__in=[100, 200, 110, 56]) # not in == select * from table_name where age in(100, 200, 110, 56)
person = PersonModel.objects.filter(age__contains='6') #包含、模糊查询contains、类似like == select * from table_name where age like '%6%'
person = PersonModel.objects.filter(age__icontains='6') # 包含、模糊查询icontains、类似like、忽略大小写
person = PersonModel.objects.filter(name__regex='^吴') #正则匹配regex
person = PersonModel.objects.filter(name__iregex='^吴') # 正则匹配、忽略大小写
person = PersonModel.objects.filter(age__range=[200, 400]) #200-400之间的数据、 两边都包含 range == select * from table_name where age between 200 and 400;
person = PersonModel.objects.filter(name__startswith='wu') #以wu开头 == select * from where name like 'wu%';
person = PersonModel.objects.filter(name__istartswith='wu') # 以wu开头 ,忽略大小写
person = PersonModel.objects.filter(name__endswith='wu') # 以wu结尾
person = PersonModel.objects.filter(name__iendswith='wu') # 以wu结尾、忽略大小写
print(person)
#聚合函数:Min、Max、sum、avg、count
#需要导入aggregate聚合函数模块
result = PersonModel.objects.aggregate(Max('age')) #最大值 输出:{'age__max': 200}
result = PersonModel.objects.aggregate(Min('age')) #最小值 输出:{'age__min': 10}
result = PersonModel.objects.aggregate(Avg('age')) #平均值 输出:{'age__avg': 104.33333333333333}
result = PersonModel.objects.aggregate(Sum('age')) #求和 输出:{'age__sum': 626}
result = PersonModel.objects.aggregate(Count('age')) #统计个数 输出:{'age__count': 6}
print(result)
# 排序 -返回QuerySet-[{字典}, ]
persons = PersonModel.objects.order_by('age')
persons = PersonModel.objects.values('name').order_by('age')
persons = PersonModel.objects.all().order_by('age') #默认做升序排序 输出:<QuerySet [吴11坊 - 10, 吴10坊 - 56, 吴13坊 - 100, 吴15坊 - 110, 吴14坊 - 150, 吴12坊 - 200]>
persons = PersonModel.objects.all().order_by('age', '-id') #先按age做升序排序、如果age相同、再按id做降序
persons = PersonModel.objects.all().order_by('-age') # 降序
print(persons.query) #返回sql语句
print(persons)
return HttpResponse('查询成功')