自学python 进击之路 - Django-模型(条件查询)

218 阅读3分钟

src=http___5b0988e595225.cdn.sohucs.com_images_20190916_32ce26032b124c3cb145a4231627373d.jpeg&refer=http___5b0988e595225.cdn.sohucs.jpg

  • 字段查询

  • 实现sql中where的功能,调用过滤器filter()、exclude()、get(),下面以filter()为例
  • 通过“属性名_id”表示外键对应对象的id值
  • 语法如下
  • 说明:属性名称和比较元素符间使用两个下划线,所以属性名不能包括多个下划线
属性名称__比较运算符=值
  • 打开booktest/views.py文件,在index视图中编写如下查询代码

条件运算符

  • exact:表示判等
  • 例、:查询编号为1的图书
list=BookInfo.books.filter(id__exact=1)
可简写为:
list=BookInfo.books.filter(id=1)

Snipaste_2021-06-30_16-18-59.png

  • contains : 是否包含
  • 说明:如果要包含%无需转义,直接写即可 例:查询书名包含‘传’的图书
list = BookInfo.books.filter(btitle__contains='传')

Snipaste_2021-06-30_16-25-00.png

  • startswith、endswith:以指定值开头或结尾
  • 例:查询书名以‘部’结尾的图书
list = BookInfo.books.filter(btitle__endswith='部')

Snipaste_2021-06-30_16-29-02.png

  • isnull : 是否为null
  • 例:查询书名不为空的图书
list = BookInfo.books.filter(btitle__isnull=False)

Snipaste_2021-07-01_13-20-46.png

  • 以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith
  • in:是否包含在范围内
  • 例:查询编号为1或3或5的图书
list = BookInfo.books.filter(pk__in=[1, 3, 5])

Snipaste_2021-07-01_13-58-40.png

  • gt、gte、lt、lte:大于、大于等于、小于、小于等于
list = BookInfo.books.filter(id__gte=3)

Snipaste_2021-07-01_14-26-43.png

  • 不等于使用等于的运算符,使用exclude()过滤器
  • 例:查询编号不等于3的图书
list = BookInfo.books.exclude(id=2)

Snipaste_2021-07-01_14-38-30.png

  • year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算
  • 例:查询1980年发表的图书
list = BookInfo.books.filter(bpub_date__year=1980)

Snipaste_2021-07-01_14-43-57.png

关联查询

  • Django中也能实现类似于join查询
  • 语法如下
关联模型类名小写__属性名__运算符=值
  • 如果没有没有“__运算符”部分,表示等于,结果和sql中的inner join相同
  • 例:查询图书,要求图书中英雄的描述包含‘八’
list = BookInfo.books.filter(heroinfo__hcontent__contains='八')

Snipaste_2021-07-01_14-48-47.png

F对象

  • 之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中
  • 语法如下
F(属性名)
  • 例:查询阅读量大于等于评论量的图书

Snipaste_2021-07-01_15-03-23.png

Q对象

  • 多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字
  • 例:查询阅读量大于20,并且编号小于3的图书
list=BookInfo.books.filter(braed__gt=20,id__lt=3)
或
list=BookInfo.books.filter(braed__gt=20).filter(id__lt=3)

Snipaste_2021-07-01_15-14-47.png

  • 如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符
  • Q对象被义在django.db.models中
  • 语法如下
Q(属性名__运算符=值)
  • 例:查询阅读量大于20的图书,改写为Q对象如下
from django.db.models import Q
...
list = BookInfo.books.filter(Q(braed__gt=20))

Snipaste_2021-07-01_15-20-20.png

  • Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或
  • 例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
list = BookInfo.books.filter(Q(braed__gt=20) | Q(pk__lt=3))

Snipaste_2021-07-01_15-24-49.png

  • Q对象前可以使用~操作符,表示非not
  • 例:查询编号不等于3的图书
list = BookInfo.books.filter(~Q(pk=3))

Snipaste_2021-07-01_15-29-29.png

聚合函数

  • 使用aggregate()过滤器调用聚合函数
  • 聚合函数包括:Avg,Count,Max,Min,Sum,被定义在django.db.models中
  • 例:查询图书的总阅读量
from django.db.models import Sum
...
list = BookInfo.books.aggregate(Sum('bread'))

Snipaste_2021-07-01_16-01-14.png

  • 使用count时一般不使用aggregate()过滤器
  • 例:查询图书总数
list = BookInfo.books.count()

Snipaste_2021-07-01_16-05-51.png

  • 在运行服务器命令行可以看到list的结果 Snipaste_2021-07-01_16-05-31.png