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('查询成功')
本文作者:little小新
本文链接:https://www.cnblogs.com/littlecc/p/18116156
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步