40.Django之ORM操作数据库
目录
1.orm简单介绍
2.orm用法与字段类型
3.orm的元选项与管理器对象
4.ORM之查询操作(查询集、过滤器)
5.orm之字段中数据的增删改查
1.orm简单介绍
1.ORM全称:Object-Relation Mapping意为:对象-关系映射
2.作用:对数据库的操作都转化成对类属性和方法的操作,不用写SQL语句(当然也有缺点)
3.在Django的app应用中model.py文件是数据的单一、明确的信息来源。通常一个模型(model)映射到一个数据库表。
4.映射关系:ORM 数据库类 ======= 数据表对象 ======= 数据行对象属性 ======= 字段5.非常重要:数据库迁移命令只要修改model.py与数据库相关代码,都要执行以下两条命令:(1)python manage.py makemigrations # 将操作记录记录到小本本上(migrations文件夹)(2)python manage.py migrate # 将操作真正的同步到数据库中
2.orm用法与字段类型
1.orm用法:属性名 = models.字段类型()2.常见字段类型(1)AutoField: 自动增长的IntegerField, 不指定时Django会自动创建属性名为id的自动增长属性(2)IntegerField: 整数(3)FloatField():浮点数(4)DecimalField(max_digits=None, decimal_places=None):可以指定精度的十进制浮点数max_digits:总位数decimal_places:小数位数(5)CharField(max_length=20):字符串(max_length:最大字符个数)必须要指定max_length参数 不指定会直接报错(6)TextFiled: 大文本字段,一般超过4000个字符时使用(7)BooleanField: 布尔字段,值为True或False(8)NullBooleanField: 支持Null、True、False三种值 (9)DateField(auto_now=False, auto_now_add=False):日期参数auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false参数auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false注意:参数auto_now_add和auto_now是相互排斥的,组合将会发生错误(10)TimeField(auto_now=False, auto_now_add=False):时间(11)DateTimeField:日期时间(12)FileField:上传文件字段,以二进制的形式(13)ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片3.常见字段属性(选项)(1)null:如果为True,表示允许为空,默认值是False(2)blank:如果为True,则该字段允许为空白,默认值是False 对比:null是数据库范畴的概念,blank是表单验证范畴的(3)db_column:字段的名称,如果未指定,则使用属性的名称(只限于数据库表中的名字,操作数据库还是类属性的名字)(4)db_index:若值为True, 则在表中会为此字段创建索引,默认值是False(为了优化查询速度 )(5)default:默认值,这可以是值或可调用对象。如果可调用,则每次创建新对象时都会调用它。(6)primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用(7)unique:如果为True, 这个字段在表中必须有唯一值,这个值不能重复,默认值是False(8)verbose_name:该参数是所有字段都有的 就是用来对字段的解释4.关系字段类型(用法与普通字段类型一样)关系型数据库的关系包括三种类型:ForeignKey: 一对多,将字段定义在多的一端中ManyToManyField: 多对多,将字段定义在任意一端中OneToOneField: 一对一,将字段定义在任意一端中5.字段的的增删改(记得执行数据库迁移的两条命令):(1)字段的增加a.可以在终端内直接给出默认值b.该字段可以为空info = models.CharField(max_length=32,verbose_name='个人简介',null=True)c.直接给字段设置默认值hobby = models.CharField(max_length=32,verbose_name='兴趣爱
好',default='study')然后执行数据库迁移的两条命令(2)字段的修改直接修改代码然后执行数据库迁移的两条命令即可!(3)字段的删(慎重)直接注释对应的字段然后执行数据库迁移的两条命令即可!注意:执行完毕之后字段对应的数据也都没有了
3.orm的元选项与管理器对象
1.元选项:(1)元选项作用:修改数据库表的默认的名称(2)元选项用法:在models.py中创建类时:class User(models.Model): # 数据库表的默认名称为模型名app_Userusername = models.CharField(max_length=20) # 用户名class Meta: # 用Meta定义元信息类db_table = 'userimfor' # db_table=""自定义表的名字2.管理器对象(1)在models.py中创建类后,Django默认生成管理器对象objects,在views.py中与数据库交互时直接用"objects.属性"的方式访问数据库。(2)在models.py创建类时,可以自定义管理器对象名,不用使用objects,用法如下:class User(models.Model): # 数据库表的默认名称为模型名app_Userusername = models.CharField(max_length=20) # 用户名class Meta: # 用Meta定义元信息类db_table = 'userimfor' # db_table=""自定义表的名字Users = models.Manager() # Manager()自定义管理器对象注意:objects是Manager类型的对象,Django不会默认生成管理器对象objects
4.ORM之查询操作(查询集、过滤器)
1.基本概念(1)查询集:表示从数据库中获取的模型对象集合(objects.),在管理器上调用过滤器方法会返回查询集查询集可以含有0个、一个或多个过滤器查询集特点:a.惰性执行:创建查询集不会访问数据库,直到在模板中调用数据时,才会访问数据库调用数据的情况包括迭代、序列化、与if合用b.缓存:查询集的结果被存下来之后,再次查询相同数据时会使用之前缓存的数据(2)过滤器:基于所给的参数限制查询的结果2.过滤器分两类(1)返回列表数据的过滤器:all(): 返回所有的数据(以对象形式)filter(): 返回满足条件的数据,括号内可以携带多个参数,参数与参数之间默认是and关系exclude(): 返回满足条件之外的数据,相当于sql语句中where部分的not关键字order_by(): 返回排序后的数据注意:返回的是列表对象,即[数据对象1,数据对象2...],获取对象,它支持索引取值和切片操作,但是不支持负数索引获取第一个对象filter().first()(2)返回单个对象的过滤器:get(): 返回单个满足条件的对象# 如果未找到会引发"模型类.DoesNotExist"异常# 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常count(): 返回当前查询的总条数aggregate(): 聚合exists(): 判断查询集中是否有数据,如果有则返回True,没有则返回False3.利用过滤器进行件查询案例(1)前设登录网页:models.py文件中创建类(数据库)class User(models.Model):id = models.AutoField(primary_key=True, verbose_name='主键')# 相当于SQL语句:id int primary_key auto_incrementusername = models.CharField(max_length=32, verbose_name='用户名')# 相当于SQL语句:username varchar(32)password = models.IntegerField(verbose_name='密码')# 相当于SQL语句:password intage = models.IntegerField(verbose_name='年龄')info = models.CharField(max_length=32,verbose_name='个人简介',null=True)# 年龄该字段默认为空hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')# 直接给兴趣爱好字段设置默认值studyviews.py文件中查询数据,通过模型对象objects.过滤器(条件)拿到数据from django.shortcuts import render, HttpResponsefrom app01 import models # 导入数据库交互文件def login(request): # 返回登录页面函数if request.method == 'POST': # 判断用户post提交数据username = request.POST.get('username')password = request.POST.get('password')# 拿到login.html文件form表单返回的username/passworduser_obj = models.User.objects.filter(username=username).first()# 通过models.py文件的User类生成的管理器对象objects,# 再以filter()过滤器,并且username=username为条件,返回列表数据行# 最后first(),拿到第一个数据对象,赋以user_obj# 也就是说此时user_obj就是数据行,通过.的方式可以访问到数据库对应数据if user_obj: # 如果数据行存在if password == user_obj.password: # 校验密码return HttpResponse("登陆成功")else:return HttpResponse("密码错误")else:return HttpResponse("用户不存在")return render(request, 'login.html') # 非post请求,返回login.html注意:在写代码时,注意哪些是要大写的(大小写要区分)(2)常见过滤器查询:a.查询id为1的用户名(用exact:判断是否相等)usernames = models.User.objects.filter(id__exact=1)b.查询姓名中包含'张'的名字(用contains:是否包含)usernames = models.User.objects.filter(username__contains='张')c.查询姓名中以‘欣’结尾的名字(用startswith/endswith:以什么开头/以什么结尾)usernames = models.User.objects.filter(username__endswith='欣')d.查询姓名不为空的成员(用isnull : 是否为null)usernames = models.User.objects.filter(username__isnull=False)e.查询编号为2或4的成员(pk:主键/id) (用in:是否包含在范围内)usernames = models.User.objects.filter(pk__in=[2,4])f.查询编号大于2的成员(gt:大于、gte:大于等于、lt:小于、lte:小)usernames = models.User.objects.filter(id__gt=2)g.查询id不等于3的成员(exclude:条件以外的数据)usernames = models.User.objects.exclude(id=3)h.查询2020年注册的成员(year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算)usernames = models.User.objects.filter(pub_date__year=2020)i.查询2020年1月1日后注册的成员from datetime import dateusernames = models.User.objects.filter(pub_date__gt=date(2020,1,1))
5.orm之字段中数据的增删改查
在views.py中对数据库数据的增删改查
from app01 import models
1.查数据# 方式一res = models.User.objects.filter(username=username)"""返回值你先看成是列表套数据对象的格式它也支持索引取值,切片操作,但是不支持负数索引它也不推荐你使用索引的方式取值user_obj = models.User.objects.filter(username=username).first()filter括号内可以携带多个参数 参数与参数之间默认是and关系"""return render(request,'userlist.html',{'user_queryset':user_queryset}) # 指定返回# 方式二user_queryset = models.User.objects.all()return render(request,'userlist.html',locals()) # 全部返回2.增数据# 方法一:res = models.User.objects.create(username=username,password=password) # 返回值就是当前被创建的对象本身# 方法二:user_obj = models.User(username=username,password=password)user_obj.save() # 保存数据/对象调用save方法3.删数据models.User.objects.filter(id_user=1).delete() # 指定删除id_user=1的数据4.改数据# 方式一:models.User.objects.filter(id=edit_id).update(username=username,password=password)# 将filter查询出来的列表中所有的对象全部更新,批量更新操作,只修改被修改的字段# 方式二:edit_obj.username = usernameedit_obj.password= passwordedit_obj.save()# 用重新赋值方式,全部逐一更换当字段特别多的时候效率会非常的低# 因为从头到尾,无论该字段是否被修改都将数据的所有字段全部更新一边
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
