使用ORM对数据库操作

酥酥 发布于 2021-09-18 933 次阅读


使用ORM对Mysql操作

一、查询操作

classname.objects.all() = select * from table

返回对象数组,通过在类中定义__ str __(self)可以更改描述


classname.objects.values('列1','列2‘) = select 列1,列2 from table

返回一个一个字典数组[{'列1':value1,'列2':value2},。。。。。]


classname.objects.values_list('列1','列2‘) =select 列1,列2 from table

返回一个一个元组数组[(value1,value2),。。。。。]


classname.objects.order_by('列1') 按照升序(默认)或者降序排序,降序则在列名前加'-'号,返回对象数组

当然classname.objects.values_list('列1','列2‘).order_by('-列3')都是可以的,很灵活

在任意语句后调用query放回数据库语法解析形式


classname.objects.filter(属性1=值1,属性2=值2)

作用:返回包含此条件的全部的数据集返回值QuerySet容器对象

内部存放 MyModel实例,说明当多个属性在一起时同与关系


classname.objects.exclude(属性1=值1,属性2=值2)

作用:返回不包含此条件的全部的数据集返回QuerySet


classname.objects.get(条件)

作用:返回满足条件的唯一一条数据说明:该方法只能返回一条数据查询

  • 结果多余←条数据则抛出Model. MultipleObjectsReturned异常查询结果
  • 如果没有数据则抛出 Model DoesNotExist异常
如果是非等值的话,要用以下方法
查询谓词定义:做更灵活的条件查询时需要使用查询谓词说明:
每一个查询谓词是一个独立的查询功能_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'‰%
_startswith:以XXX开始
_endswith:以XXX结束
_gt:大于指定值
样例: Author.objects.filter( age_gt=50) #等同于 select from author where age>50
_gte:大于等于
_lt:小于
_lte:小于等于
_in:查找数据是否在指定范围内样例: 
Author.objects.filter( Country.In=[中国,日本’,韩国”])
#等同于 select * from author where country in('中国’,'日本’,韩国)
_range:查找数据是否在指定的区间范围内样例:
#查找年龄在某一区间内的所有作者Author.objects.filter(age range=(35, 50))
#等同于 SELECT , WHERE Author BETWEEN 35 and 50 两个闭区别

二、更新操作

对于单个数据

一查二改三保存

一查:get方法获取属性对象

二改:对象.属性=赋值

三保存:对象.save()


批量更新数据

直接调用 QuerySet的 update(属性=值)实现批量修改

例 #将id大于3的所有图书价格定为0元 books = Book objects.filter(id_gt=3)

books.update(price=0)

#将所有书的零售价定为100元

books=Book objects.all()

books.update(market_price=100)

三、删除操作

对于单个数据

1查找查询结果对应的一个数据对象
2调用这个数据对象的 deleted方法实现删除
try:
auth= Author.objects.get(id=1)
auth.delete() 
except:print(删除失败)

对于多个数据

1.查找查询结果集中满足条件的全部 QuerySet查询集合对象
2.调用查询集合对象的 deleted方法实现删除
#删除全部作者中,年龄大于65的全部信息
auth= Author.objects.filter(age_gt=65)
auth.delete()

不过实际项目中多用伪删除,表现为增加一个字段BooleanField用来表示是否显示数据,在获取数据的时候都需要判断一下