文章目录

  • 1.查询函数
  • 2.F对象
  • 3.Q对象
  • 4.聚合函数
  • 5.Count函数
  • 6.查询集
    • 查询集的特性
    • 对查询集进行切片
    • 判断一个查询集中是否有数据
  • 7.模型类之间的关系
    • 一对多关系
    • 多对多关系
    • 一对一关系
  • 8.关联查询(一对多)
  • 9.插入、更新和删除
  • 10.自关联
  • 11.管理器
    • 自定义管理器类
  • 12.元选项

1.查询函数

模型类.objects.函数名()

函数:
get:返回满足条件的一条数据,只能返回一条数据。参数为条件。
all:返回满足条件的查询集,QuerySet类型
filter:返回满足条件的数据。QuerySet类型,参数为条件。可以传入多个参数。
exclude:返回不满足条件的数据。QuerySet类型,参数为条件。
order_by:对查询结果进行排序。QuerySet类型

条件参数格式
判等条件id__exact==1(等价于id=1)
模糊查询
包含btitle__contains='乐',开头btitle__startswith='value',结尾btitle__endswith='value'
空查询btitle__isnull=False
查询范围id__in[1,3,5]
比较查询
id__gt=3 (great than)大于 , id__gte=3 大于等于
id__lt=3(less than)小于 ,id__lte=3 小于等于
日期查询
方法一 publish_date__year=1980
方法二 publish_date__gt=date(1980,1,1)
排序
从小到大

BookInfo.objects.all().order_by('id')

从大到小

BookInfo.objects.all().order_by('-id')

2.F对象

作用:用于类属性之间的比较

from django.db.models import F

例如:查询阅读量大于评论量

BookInfo.objects.filter(read__gt=F('comment'))

3.Q对象

作用:用于查询时条件之间的逻辑关系,not and or,可以对Q对象进行& | ~操作

from django.db.models import Q

例如:id>3且阅读量大于30

BookInfo.obkects.filter(id__gt=3,read__gt=30)
BookInfo.obkects.filter(Q(id__gt=3)&Q(read__gt=30))

例如:查询id大于3或者阅读量大于30的图书信息

BookInfo.obkects.filter(Q(id__gt=3)|Q(read__gt=30))

例如:查询id不等于3的图书信息

BookInfo.obkects.filter(~Q(id__gt=3))

4.聚合函数

对查询结果进行聚合操作:sum count avg max min
在Django中调用aggregate函数来使用聚合,返回值是一个字典。

from django.db.models import Sum,Count,Max,Min,Avg

例如:查询所有图书的数目

>>> BookInfo.objects.all().aggregate(Count("id"))
{'id__count': 9}

例如:所有图书的阅读量总和

>>> BookInfo.objects.all().aggregate(Sum("read"))
{'read__sum': 9245}

5.Count函数

作用:统计满足条件数据的数目,返回值是一个数字
例如:统计所有图书的数目

>>> BookInfo.objects.all().count()
9

6.查询集

all filter exclude order_by 调用这些函数会产生一个查询集,QuerySet类对象可以继续调用上面的所有函数。

查询集的特性

惰性查询:只有在实际使用查询集中的数据的时候才会发生数据库真正查询。
缓存:当时用的是同一个查询集时,第一次的时候会发生实际数据库的查询,然后把结果缓存,之后再使用这个查询集时,使用的是缓存中的数据。

对查询集进行切片

下标不允许为负数

>>> books=BookInfo.objects.all()
>>> books[2:5]
[<BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>]

判断一个查询集中是否有数据

使用 exists 判断,没有返回False,有返回True

>>> books=BookInfo.objects.all()
>>> books1 = books[0:0]
>>> books1.exists()
False

7.模型类之间的关系

一对多关系

models.ForeignKey()定义在多类中

多对多关系

models.ManyToManyField()定义在双方都可以

class NewsType(models.Model):type_name = models.CharField(max_length=20)class NewsInfo(models.Model):title = models.CharField(max_length=120)pub_date = models.DateTimeField(auto_now_add=True)content = models.TextField()news_type = models.MangToManyField('NewsType')

一对一关系

models.OneToOneField() 定义在双方都可以

8.关联查询(一对多)

例:查询图书id为1的所有英雄的信息

books=BookInfo.objects.get(id=1)
books.heroInfo_set.all()

通过模型类查询:

HeroInfo.obkects.filter(hbook__id=1)

例:查询id为1的英雄关联的图书信息

h = HeroInfo.objects.get(id=1)
h.hbook

通过模型类查询:

BookInfo.objects.filter(heroinfo__id=1)//多类类名小写

9.插入、更新和删除

10.自关联

自关联是一种特殊的一对多关系
例如:地区表的父级关系,陕西省-西安市,西安市的areaParent_id为陕西省的ID

class AreaInfo(models.Model):areaName = models.CharField(max_length=100)areaParent = models.ForeignKey('self',null=True,blank=True)

11.管理器

BookInfo.objects.all()objects是一个Django自动生成的管理器对象,通过这个对象可以实现对数据的查询。objectsmodels.Manager类的一个对象。

>>> type(BookInfo.objects)
<class 'django.db.models.manager.Manager'>

自定义管理器类

自定义BookInfoManager类,这个类继承自models.Manager,并且重写all()方法。

class BookInfoManager(models.Manager):#user defined class of managing the bookinfo#override function all()def all(self):#call all() of super classbooks = super().all()for item in books:print("bookTile:"+item.bookTitle)return books
class BookInfo(models.Model):bookTitle = models.CharField(max_length=20)publish_date = models.DateField()read = models.IntegerField(default=0)comment = models.IntegerField(default=0)#Delete tagisDelete = models.BooleanField(default=False)objects = BookInfoManager()

自定义管理器方法:

class BookInfoManager(models.Manager):#user defined class of managing the bookinfo#override function all()def all(self):#call all() of super classbooks = super().all()for item in books:print("bookTile:"+item.bookTitle)return booksdef createBook(self,bookTitle,publish_date):model_class = self.modelobj =model_class()obj.bookTitle = bookTitleobj.publish_date = publish_dateobj.save()return obj
>>> from booktest002.models import BookInfo
>>> BookInfo.objects.createBook("xcjs","1999-1-1")
<BookInfo: BookInfo object>
>>> BookInfo.objects.all()
bookTile:lldq
bookTile:xyj
bookTile:xyj
bookTile:xyj
bookTile:xyj
bookTile:xyj
bookTile:xyj
bookTile:xyj
bookTile:xyj
bookTile:jpm
bookTile:xcjs
[<BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>, <BookInfo: BookInfo object>]

可以通过self.model()获取所在模型类,这样即使模型类名发生变化,也能正常使用。

>>> BookInfo.objects.model
<class 'booktest002.models.BookInfo'>

12.元选项

模型类对应的表已经生成,此时,模型类或应用一旦改名,与数据库表名不对应就会出现问题。Django默认生成的表名:应用名小写_模型类名小写
如何解决?
使用元选项:需要在模型类中定义一个元类Meta,在里面定义一个类属性db_table就可以指定表名。

class BookInfo(models.Model):bookTitle = models.CharField(max_length=20)publish_date = models.DateField()read = models.IntegerField(default=0)comment = models.IntegerField(default=0)#Delete tagisDelete = models.BooleanField(default=False)objects = BookInfoManager()class Meta:db_table = "bookinfo"

指定之后,重新迁移,数据库表名就不依赖其模型类了。

Django学习笔记(3):使用模型类进行查询(查询函数、F对象、Q对象、聚合函数、查询集、模型类关系、关联查询、自关联、管理器)相关推荐

  1. django 学习笔记

    django 学习笔记 启动虚拟机: workon bj18_py3 创建一个项目: django-admin.py startproject mysite 启动开发用服务器:从外层项目 mysite ...

  2. django学习笔记03

    原创博客地址:django学习笔记03 第一章,模型层 查询集API 一.QuerySet何时被提交 迭代 QuerySet是可迭代的,在首次迭代查询集时执行实际的数据库查询 切片:如果使用切片的&q ...

  3. django学习笔记02

    原创博客地址:django学习笔记02 第一章:模型层 1.8 查询操作 一.创建对象 1 2 3 4 5 >>> from blog.models import Blog > ...

  4. django学习笔记01

    原创博客地址:django学习笔记01 基于教程,刘江的博客教程Django教程:https://www.liujiangblog.com/course/django/87 第一章:模型层 1.1 模 ...

  5. 千锋Django学习笔记

    千锋Django学习笔记 文章目录 千锋Django学习笔记 写在前面 1. MVC和MTV 2. Django简介 3. MTV简单流程 4. 和Model的简单对接 5. Model 6. Tem ...

  6. Django学习笔记(五)

    Django学习笔记(五) MVC和MTV对比 传统的MVC(Model-View-Controller) M 模型层,主要是对数据库层的封装 V 视图层,向用户展示结果 C 控制层,用于请求,获取数 ...

  7. Django学习笔记---第一天

    Django学习笔记 1.Django的安装 //如果不指定版本号,默认安装最新版 pip3 install django==1.11.8 关于Django的版本和python的版本依赖关系,请看下图 ...

  8. 九.django学习笔记二

    django学习之模型 我们在前面已经讲过,模型是专门与数据库交互的部分,那模型是如何实现增删改查的呢,已经如何在项目中使用我们的mysql数据库呢 一.数据库的增删改查 增:book = BookI ...

  9. 分享:Django学习笔记(4)---ManyToMany 添加、删除关联、查询

    Django学习笔记(4)---ManyToMany 添加.删除关联.查询 http://my.oschina.net/u/572994/blog/105280

  10. 梅科尔工作室-Django学习笔记(二次学习)(3)

    本次学习的是如何用django实现前端鸿蒙OS登录 下面介绍一下本次的操作过程. 1.首先创立MySQL数据并将数据库导入到django当中 其中:导入数据库的操作: 2.配置urls 对应新建的pe ...

最新文章

  1. 【Java 并发编程】线程指令重排序问题 ( 指令重排序规范 | volatile 关键字禁止指令重排序 )
  2. 类加载器的双亲委派及打破双亲委派
  3. PostgreSQL表的行数统计
  4. 数据结构——二叉树的最长路径问题
  5. axis=0 与axis=1 的区分
  6. jmap+MAT实战内存溢出
  7. java获取C盘下的隐藏目录文件名称
  8. 当我们谈数据库时,是在谈什么?
  9. django分页-Paginator类
  10. 数据结构上机实践第八周项目3-顺序串算法
  11. 2021-11-16-小甲鱼python教学视频总结
  12. 软件安全实验——lab10(一、基于时间的侧信道攻击)
  13. Centos 7 Opencv安装使用
  14. xp计算机u盘重装系统,解决戴尔电脑u盘重装系统xp教程
  15. OCCT v11.0.16 x64 电脑硬件检测烤鸡软件中文
  16. 计算机更换内存条后无法连接网络,换主机后怎么连接网络
  17. linux 截取某一段时间的日志,存储到另一个文件中
  18. c语言md5函数 linux,【转】MD5校验C语言实现源代码
  19. 【CRH】列车通过曲线时,曲线半径、超高值与车速的关系
  20. 俞敏洪的一分钟励志演讲

热门文章

  1. 机器人系统的基本概念及外部模型参数详解
  2. 【DLL的函数】关于DLL的函数|_declspec(dllimport)
  3. 进制之间快速转换技巧
  4. 投影仪应该怎么选择?数码粉总结目前最好的家用投影仪
  5. 高频功率放大器输出为什么会有高次谐波
  6. maven打包缺少依赖异常eu.neilalexander:jnacl:jar:1.0.0 was not found in...解决
  7. 生命苍白无力时候遇到你,即使再难也要亲手绘出五彩生活――读《平庸的世界》有感...
  8. 苹果首款自研芯片 M1 惊艳亮相,带来最强三款 Mac 电脑!
  9. OEM,ODM,OBM,JDM概念
  10. Revit-BIM模型轻量化 帧率控制