4.查询集 查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以含有零个、一个或多个过滤器。...过滤器基于所给的参数限制查询的结果,从Sql的角度,查询集和select语句等价,过滤器像where和limit子句。 返回查询集的过滤器如下: all():返回所有数据。...在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中,并返回请求的结果,接下来对查询集求值将重用缓存中的结果。...限制查询集 可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。 注意:不支持负数索引。 对查询集进行切片后返回一个新的查询集,不会立即执行查询。...自定义管理器类主要用于两种情况: 1.修改原始查询集,重写all()方法 2.向管理器类中添加额外的方法,如向数据库中插入数据。 1.修改原始查询集,重写all()方法。
查询数据 数据库的查询需要使用管理器对象进行 通过 MyModel.objects 管理器方法调用查询接口 方法 说明 all() 查询全部记录,返回QuerySet查询对象 get() 查询符合条件的单一记录...(元组表示) 方法:values_list (‘列 1’,‘列 2’) 用法:MyModel.objects.values_list (…) 作用: 返回元组形式的查询结果 返回值: QuerySet...删除单个MyModel对象或删除一个查询结果集(QuerySet)中的全部对象都是调用 delete()方法 删除单个对象 步骤 查找查询结果对应的一个数据对象 调用这个数据对象的 delete ()...方法分组聚合得到分组结果 QuerySet.annotate (名 = 聚合函数 (‘列’)) 返回 QuerySet 结果集,内部存储结果的字典 如: pub_count_set = pub_set.annotate...='机械工业出版社')) 原生的数据库操作方法 使用MyModel.objects.raw()进行 数据库查询操作查询 在django中,可以使用模型管理器的raw方法来执行select语句进行数据查询
C全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。 MVT M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。...模型类.DoesNotExist 异常 all 多个结果 count 查询结果数量 过滤查询 filter 过滤多个结果 exclude 排除 get 过滤单一结果 过滤条件的表达语法 属性名称...():判断查询集中是否有数据,有返回Ture,无返回False 2、特性 惰性执行:创建查询集的时候不会调用数据库,调用数据的时候访问,迭代、序列化、if合用 缓存 3、限制查询集 对查询集进行下标或切片操作...,切片后返回新的查询集,不会立即执行 管理器Manageer 1、自定义管理器 修改原始查询集,重写all()方法 booktest/models.py文件中 #图书管理器 class BookInfoManager...() 在管理器类中补充定义新的方法 打开booktest/models.py文件,定义方法create 为模型类BookInfo定义管理器books语法如下 调用方法 八、Admin 使用 1
你有两个原因可能会自己定义管理器:向器类中添加额外的方法,或者修改管理器最初返回的查询集。...在这种情况下,使用 模型方法 比使用自定义的管理器方法要更好。) 自定义的管理器 方法可以返回你想要的任何数据,而不只是查询集。...这个例子要注意的一点是: 管理器方法可以访问 self.model来得到它所用到的模型类。 修改管理器初始的查询集 管理器自带的 查询集返回系统中所有的对象。...Django 会将模型中定义的管理器解释为默认的 管理器,并且 Django 中的一部分应用(包括数据备份)会使用默认的管理器,除了前面那个模型。...在自动管理器实例中编写正确的管理器 在上面的django.contrib.gis 已经提到了, use_for_related_fields这个特性是在需要返回一个自定义查询集子类的管理器中使用的。
自定义管理器类主要用于两种情况: 1.修改原始查询集,重写all()方法 2.向管理器类中添加额外的方法,如向数据库中插入数据。 1.修改原始查询集,重写all()方法。...答:objects是Django帮我自动生成的管理器对象,通过这个管理器可以实现对数据的查询。...自定义管理器类的应用场景 1.改变查询的结果集。 比如调用BookInfo.books.all()返回的是没有删除的图书的数据。 2.添加额外的方法。...models.Manager): """图书模型管理器类""" # 改变查询的结果集 def all(self): # 1.调用父类的all,获取所有数据 books = super()....2.为模型类添加额外的方法,使其通过模型类.方法名就可以插入保存数据 class BookInfoManager(models.Manager): """图书模型管理器类""" # 改变查询的结果集
QuerySet 概念: Django的ORM中存在查询集的概念。...查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。...当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表): all():返回所有数据。...过滤器基于所给的参数限制查询的结果 从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子句。...: 管理器是Django的模型进行数据库操作的接口,Django应用的每个模型类都拥有 至少一个管理器。
查询集 QuerySet 查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。...当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表): all():返回所有数据。 filter():返回满足条件的数据。 exclude():返回满足条件之外的数据。...对查询集可以再次调用过滤器进行过滤,如 BookInfo.objects.filter(bread__gt=30).order_by('bpub_date') 从SQL的角度讲,查询集与select语句等价...会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。...qs = BookInfo.objects.all()[0:2] 管理器manager 自定义manager 注意:一旦为模型类指明自定义的过滤器后,Django不再生成默认管理对象objects。
django提供两种方法使用原始sql进行查询:一种是使用Manager.raw()方法,进行原始查询并返回模型实例;另一种是完全避开模型层,直接执行自定义的sql语句。...警告 传递给raw()方法的sql语句并没有任何检查。django默认它会返回一个数据集,但这不是强制性的。如果查询的结果不是数据集,则会产生一个错误。...翻译参数是一个字典,将表中的字段名称映射为模型中的字段名称、例如,上面的查询可以写成这样: >>> name_map = {'first': 'first_name', 'last': 'last_name...Django 使用主键来识别模型的实例,所以它在每次原始查询中都必须包含。如果你忘记包含主键的话,会抛出一个InvalidQuery异常。 增加注解 你也可以在查询中包含模型中没有定义的字段。...花费一点性能之后,你可以返回一个字典形式的结果,像这样: def dictfetchall(cursor): "Returns all rows from a cursor as a dict"
字段类型 Django中每个模型类都会被映射为数据表,而模型类属性则被映射为数据表中的字段。...函数名 功能 返回值 说明 get 返回表中满足条件的一条且只能是一条数据。 模型类对象 参数为查询条件。1) 如果查到多条数据,则抛异常MultipleObjectsReturned。...QuerySet对象 参数为查询条件。 exclude 返回表中不满足条件的数据。 QuerySet对象 参数为查询条件。 order_by 对查询结果进行排序。...缓存: 当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果。...谓词 Django的查询条件是一种独特的字段查询表达方式,表现形式为: 字段名称__谓词=值 即用‘双下划线连接的字段名称和谓词’来表示查询的条件。
~共 10 章,31 子模块数据库学习目标能够进行Django数据库配置掌握Django中模型类的定义掌握Django中的迁移命令的使用能够使用Django的ORM进行数据库的增删改查能够说明查询集QuerySet...,其类型为: django.db.models.manager.Manager通过objects属性,可以实现对数据库相关的操作,常用方法如下objects管理器中的方法返回类型作用模型类.objects.create...例:把id大于3的员工信息按年龄从大到小排序显示五、aggregate 方法作用: 聚合操作,对多行查询结果中的一列进行操作,返回一个值用法: 模型类.objects.aggregate(聚合类('属性名...管理器中的方法返回类型作用模型类.objects.all()QuerySet查询所有的对象模型类.objects.filter()QuerySet查询满足条件的对象模型类.objects.exclude...()QuerySet查询不满条件的对象模型类.objects.order_by()QuerySet对查询结果集进行排序2)QuerySet 提供的方法QuerySet方法返回类型作用get()模型对象查询一个对象
在查询数据的时候,对于某种固定的查询,例如视图之类的查询,通用类型的查询每次都需要写一遍,有没有一个地方可以将这类通用的查询抽象出来,进行模型的业务管理呢? 这时候就要看看模型的管理器了。...默认情况下,Django 为每个Django模型类添加一个模型管理类Manager的对象为objects。...将某些固定的查询写到模型管理类中,避免重复编写。 自定义管理器类主要用于两种情况: 1.修改原始查询集,重写all()方法 2.向管理器类中添加额外的方法,如向数据库中插入数据。...return super().all().filter(is_delete=False) # 设置只返回未删除的数据 b)在模型类MiddlewareInfo中定义管理器 class...2.在管理器类中定义创建对象的方法 对模型类对应的数据表进行操作时,推荐将这些操作数据表的方法封装起来,放到模型管理器类中。
特点:低耦合 M模型层:主要用于对数据库层的封装 V视图层:用于给用户展示结果(WHAT + HOW显示什么,怎么显示) C控制层:用于处理请求、获取数据、返回结果 Django:MTV模式 把MVC的...返回值:QuerySet,存放模型实例 exclude(条件) 语法同上 等价于 WHERE NOT 作用:返回不包含此条件的全部数据集 电商取非可以用该语句 get(条件...字典 分组聚合 其实是为了实现Having语句 通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值,为查询集的每一项生成聚合 QuerySet.annotate(结果变量名(别名)=聚合函数...模型管理器类 作用:为后台管理界面添加便于操作的新功能 继承于django.contrib.admin里的ModelAdmin类 在应用的admin.py定义模型管理器类 class XXXXManager...场景:1.博客列表页;2.电商商品详情页 场景特点:数据变动频率较少 Django中设置缓存:(settings.py) 数据库缓存:将缓存存储在数据库中,尽管存储介质还是数据库,但把一次复杂查询的结果直接存储在表里
如果这些还不够强大: 使用原始的SQL 编写你自己的自定义SQL语句,来获取数据或者填充模型。...使用django.db.connection.queries来了解Django为你编写了什么,以及从这里开始。..., 以及在适当的管理器和默认管理器中。... {% endif %} {% endwith %} {% endif %} 这是因为: 因为查询集是延迟加载的,如果‘display_inbox’为False,不会查询数据库。...{% if emails %}的那一行调用了QuerySet.bool(),它导致user.emails.all()查询在数据库上执行,并且至少在第一行以一个ORM对象的形式返回。
每个模型对 应数据库中唯一的一张表 如何编写模型 模型:每个模型都用一个类表示,该类继承自django.db.models.Model。...也可以使用一条语句创建并保存一个对象,使用create()方法 查询对象 通过模型中的管理器构造一个查询集,来从你的数据库中获取对象。 查询集(queryset)表示从数据库中取出来的对象的集合。...例如,User.objects.all() 返回包含数据库 中所有Blog 对象的一个查询集。 获取所有对象 获取一个表中所有对象的最简单的方式是全部获取。...这个异常是正在查询的模型类的一个属性 —— 所以在上面的代码中, 如果没有主键为1 的Entry 对象,Django 将引发一个Entry.DoesNotExist。...如果您在某些情 况下使用查询集的结果,当您最初获取数据时不知道是否需要这些特定字段,可以告诉 Django不要从数据库中检索它们。
此时进入 shell, 我们可在 shell 中通过面向对象方式对数据库中的数据进行 CRUD 操作. 1 插入操作 在 Django 中我们不需要编写一行 SQL 语句, 就可以对数据库中的数据进行操作...get 方法: 如果你知道只有一个对象满足你的查询,你可以使用管理器的 get 方法,它直接返回该对象....可以使用管理器的 all 方法: all_cags = GoodsCategory.objects.all() all 方法返回包含数据库中所有对象的一个查询结果集。...对结果使用切片语法, 例:获得所有结果集的前两个对象组成的结果集: cags = GoodsCategory.objects.all()[1: 3] filter 方法: all 方法返回了一个包含数据库表中所有记录查询集...但在通常情况下,我们往往想要获取的是完整数据集的一个子集. 要创建这样一个子集,你需要在原始的的查询集上增加一些过滤条件。
正向查询( ForeignKey 所在的模型查询关联的模型) car = Car.objects.get(pk=2) car.manufacturer #返回一条Manufacturer 对象 反向查询...( ForeignKey 指向的模型查询ForeignKey 所在的模型) 如果模型有一个ForeignKey,那么该ForeignKey 所指的模型实例可以通过一个管理器返回前一个有ForeignKey...默认情况下,这个管理器的名字为foo_set,其中foo 是源模型的小写名称。该管理器返回的查询集可以用上一节提到的方式进行过滤和操作。...models.Model): name = CharField(max_length=50) groups = models.ManyToManyField(Group) 建议以被关联模型名称的复数形式做为...ManyToManyField 的名字 在哪个模型中设置 ManyToManyField 并不重要,在两个模型中任选一个即可——不要在两个模型中都设置 一对一 一对一是通过django.db.models.OneToOneField
Meta 继承 当一个抽象基类被建立,Django 将所有你在基类中申明的 Meta 内部类以属性的形式提供。若子类未定义自己的 Meta 类,它会继承父类的 Meta。...多表继承 Django 支持的第二种模型继承方式是层次结构中的每个模型都是一个单独的模型。每个模型都指向分离的数据表,且可被独立查询和创建。...Person 查询结果不会被排序,但 OrderdPerson 查询接轨会按 last_name 排序。...代理模型继承“Meta”属性 和普通模型一样。 QuerySet 仍会返回请求的模型¶ 当你用 Person 对象查询时,Django 永远不会返回 MyPerson 对象。...Person 对象的查询结果集总是返回对应类型。代理对象存在的全部意义是帮你复用原 Person 提供的代码和自定义的功能代码(并未依赖其它代码)。
查询函数 我们在Django中通过:模型类.objects属性调用以下函数来进行查询 get: 返回表中满足条件的一条数据,有且只能有一条,查询出多条会报异常。 查询不到数据也会报异常。...2、缓存 当我们使用同一个查询集的时候,只有第一次是执行到数据库,然后把结果储存起来,当我们再次使用这个查询集的时候,就会调用我们缓存中的数据。...查询集相当于一个列表,我们取值可以遍历取出,也可以进行下表或者切片取出。 当我们对一个查询集进行切片或下标查询,会返回一个新的查询集。 不同的是我们的切片不允许为负值。 判断一个查询集是否有数据。...查询集.exists(),有返回True,没有返回False 模型类关系 1、一对多关系 例如一个班级对应多个人 我们需要用ForeignKey()来关联我们的模型。...同样的查询方式。 管理器 什么是管理器? 我们每次查询的时候都会是模型.objects.xxx。 这个objects是Django帮我们自动生成的管理器对象。通过objects来帮助我们查询信息。
简介 查询集表示从数据库中获取的对象集合 查询集可以含有零个、一个或多个过滤器 过滤器基于所给的参数限制查询的结果 从Sql的角度,查询集和select语句等价,过滤器像where和limit子句 接下来主要讨论如下知识点...查询集 字段查询:比较运算符,F对象,Q对象 查询集 在管理器上调用过滤器方法会返回查询集 查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤 惰性执行:创建查询集不会带来任何数据库的访问...():返回第一个对象 last():返回最后一个对象 exists():判断查询集中是否有数据,如果有则返回True 限制查询集 查询集返回列表,可以使用下标的方式进行限制,等同于sql中的limit和...,[0:1].get()引发DoesNotExist异常 查询集的缓存 每个查询集都包含一个缓存来最小化对数据库的访问 在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中...,并返回请求的结果,接下来对查询集求值将重用缓存的结果 情况一:这构成了两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载 print([e.title for e in Entry.objects.all
领取专属 10元无门槛券
手把手带您无忧上云