Django 中 models ORM 的使用
-
查询数据:
- get() 查询单个数据,查不到报错,查多了也报错,返回满足条件的唯一一条数据
- all() 查询所有数据,返回QuerySet容器对象,内部存放 MyModel 实例
- filter() 查询指定条件数据,返回QuerySet容器对象,内部存放 MyModel 实例
- values() 查询指定列数据,返回查询结果容器,容器内存字典,每个字典代表一条数据
- exclude() 查询不满足此条件的数据,返回不包含此条件的全部的数据集。
- order_by() 将查到的指定列进行排序,默认是按照升序排序,降序排序则需要在列前增加 ‘-’ 表示。
-
修改数据:
-
修改单个使用 get() 方法
-
一查、二改、三保存
from bookstore.models import Book abook = Book.objects.get(id=10) abook.market_price = "10.5" abook.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)
-
-
-
删除数据:
-
删除单个对象
-
一查、二删
-
try: auth = Author.objects.get(id=1) auth.delete() except: print(删除失败)
-
-
删除查询数据集
-
查询满足条件的所有 QuerySet 中的对象,调用 delete() 方法删除
-
# 删除全部作者中,年龄大于65的全部信息 auths = Author.objects.filter(age__gt=65) auths.delete()
-
-
伪删除:
- is_active 布尔型 default=True, 删除时 将该字段值置为False;
- 注意查询数据时,添加过滤条件【is_active=True】
-
-
查询谓词
-
每个查询谓词是一个独立的查询功能
-
__in
: 查找数据是否在指定范围内Author.objects.filter(country__in=['中国','日本','韩国']) # 等同于 select * from author where country in ('中国','日本','韩国')
-
__gt
: 大于指定值Author.objects.filer(age__gt=50) # 等同于 select * from author where age > 50
__gte
: 大于等于 2.__lt
: 小于 3.__lte
: 小于等于
-
__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 '%w%'
-
__range
: 查找数据是否在指定的区间范围内# 查找年龄在某一区间内的所有作者 Author.objects.filter(age__range=(35,50)) # 等同于 SELECT ... WHERE Author BETWEEN 35 and 50;
-
-
聚合查询:
- 聚合查询是指对一个数据表中的一个字段的数据进行部分或全部进行统计查询
- 导入方法:
from django.db.models import *
- 聚合函数:Sum, Avg, Count, Max, Min
- 不分组查询
- 语法:MyModel.objects.aggregate(结果变量名=聚合函数(‘列’))
- 返回值:由结果变量名和值组成的字典 {“结果变量名”: 值}
- 分组查询
- 语法:
- 通过先用查询结果MyModel.objects.values 查找查询要分组聚合的列
- 通过返回结果的 QuerySet.annotate 方法分组聚合得到分组结果
- 返回值:返回 QuerySet 结果集,内部存储结果的字典
- 语法:
- 不分组查询
-
**F对象:**通常用于对数据库中的字段值在不加载到内存中的情况下直接在数据库服务器端进行操作
from django.db.models import F 例 :Book.objects.all().update(market_price=F('market_price')+10) 例 :books = Book.objects.filter(market_price__gt=F('price'))
-
**Q对象:**用于查询时的逻辑条件。可以对 Q 对象进行 &(与) |(或) ~(非) 操作。
from django.db.models import Q Q(条件1)|Q(条件2) # 条件1成立或条件2成立 Q(条件1)&Q(条件2) # 条件1和条件2同时成立 Q(条件1)&~Q(条件2) # 条件1成立且条件2不成立