首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Django】QuerySet以及Pickle 序列化在Django中的深度运用详解

QuerySet QuerySet本身可以在不访问数据库的情况下构造、过滤、切片或复制和分配。只需要在需要从数据库检索数据或将数据保存到数据库时访问数据库。...这是为了方便Python交互式解释器,因此当以交互方式使用API时,可以立即看到结果。 len()调用len()时,将执行QuerySet。正如所期望的,这将返回结果列表的长度。...Django为此提供了count()方法。 Pickle 序列化 QuerySet 如果pickle以序列化QuerySet,这将强制在pickle序列化之前将所有结果加载到内存中。...这意味着当取消缓存QuerySet时,它包含缓存时的结果,而不是数据库中当前的结果。 如果只想提取将来从数据库中重新创建QuerySet所需的信息,请提取QuerySet的查询属性。...[{'id': 1, 'name': 'Beatles Blog'}]> 类QuerySet(模型=无,查询=无,使用=无,提示=无) 通常,当与QuerySet交互时,将通过链过滤器使用它。

1.8K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Django 聚合与查询集API实现侧边栏

    annotate()子句的返回结果是一个查询集 (QuerySet);这个 QuerySet可以用任何QuerySet方法进行修改,包括 filter(), order_by()。...__startswith="Django").annotate(num_authors=Count('authors')) # 使用annotate() 子句时,过滤器有限制注解对象的作用。...')) # 使用aggregate()子句时,过滤器有限制聚合对象的作用。...,但只有作者名称和average_rating 注解会返回在输出结果中 4.查询集(QuerySet)API 查询 本质上,可以创建、过滤、切片和传递查询集而不用真实操作数据库。...可以通过迭代、切片、序列化/缓存、repr()、len()、list()、bool() 1)返回新的查询集方法 filter(): 返回一个新的QuerySet,包含与给定的查询参数匹配的对象。

    1.5K20

    【Django】聚合在Django的详细解析以及运用在企业级项目里的方法

    在此示例中,将计算Book模型上价格字段的平均值。可以在QuerySet引用中找到可用聚合函数的列表。 Aggregate()是QuerySet的一个结束语句。...].authors__count 1 与聚合()不同,annotate()不是终端子句。...应用于公共模型字段的任何过滤器()(或exclude())都将具有约束被认为是聚合的对象的效果。 当使用annotate()子句时,过滤器具有约束注释对象计算的效果。...当注释()子句应用于查询时,将根据查询状态计算注释,直到请求的注释。这实际上意味着filter()和annotate()不是可互换的操作。 例如: 出版商A有两本评分为4和5的书。...过滤器优先于注释,因此过滤器限制了计算注释时要考虑的对象。 第一个查询请求具有至少一本得分大于3的书的平均得分。第二个查询仅请求得分超过3的作者书的平均分数。

    2K40

    Django学习笔记之Queryset详解

    manager类,而不是自定义QuerySet类,一般的我们没有自定义QuerySet类的必要;django.db.models模块中的Model类,我们定义表的model时,就是继承它,它的功能很强大...1.5 len() 计算QuerySet元素的数量,并不推荐使用len(),除非QuerySet是求过值的(即evaluated),否则,用QuerySet.count()获取元素数量,这个效率要高。...=True).annotate(n=Count(‘job__name’)) #多对多反向连接,User与Job是多对多 >>> len(a) #这里才会对a求值 >>> len(b) #这里才会对...2.4.11  exists()、count()、len() 如果只是想知道一个QuerySet是否为空,而不想获取QuerySet中的每个元素,那就用exists(),它要比len()、count()...如果只想知道一个QuerySet有多大,而不想获取QuerySet中的每个元素,那就用count();如果已经从数据库获取到了QuerySet,那就用len() 2.4.12  contains/startswith

    2.7K30

    django 1.8 官方文档翻译: 2-5-4 聚合 (初稿)

    name__startswith="Django").annotate(num_authors=Count('authors')) 使用aggregate()子句时,过滤器有限制聚合对象的作用。...) 这个查询首先生成一个注解结果,然后再生成一个作用于注解上的过滤器。...在第二个查询中,过滤器在注解之前,所以,在计算注解值时,过滤器就限制了参与运算的对象的范围。 order_by() 注解可以用来做为排序项。...num_authors') values() 通常,注解会添加到每个对象上 —— 一个被注解的QuerySet会为初始QuerySet的每个对象返回一个结果集。...Django 永远不会 删除你所指定的排序限制(我们不能改动那些方法的行为,因为这会违背 API stability 原则)。 聚合注解 你也可以在注解的结果上生成聚合。

    1.7K30

    【愚公系列】2022年01月 Python教学课程 42-Django框架之ORM中查询详解

    all查询多个结果。 count查询结果数量。...() 4 2.过滤查询 实现SQL中的where功能,包括 filter过滤出多个结果 exclude排除掉符合条件剩下的结果 get过滤单一结果 对于过滤条件的使用,上述三个方法相同,故仅以filter...查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。 当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表): all():返回所有数据。...过滤器基于所给的参数限制查询的结果。 从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子句。...2 两大特性 1)惰性执行 创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用 例如,当执行如下语句时,并未进行数据库查询,只是创建了一个查询集books

    1.9K40

    Django学习笔记:QuerySet API

    他的方法全部都是通过Python动态添加的方式,从QuerySet类中拷贝过来的。 所以我们如果想要学习ORM模型的查找操作,必须首先要学会QuerySet上的一些API的使用。...: print(sql) 那如果确实是想要在查询的时候指定过滤条件该如何做呢,这时候我们可以使用django.db.models.Prefetch来实现,Prefetch这个可以提前定义好queryset...如果想要知道总共有多少条数据,那么建议使用count,而不是使用len(articles)这种。因为count在底层是使用select count(*)来实现的,这种方式比使用len函数更加的高效。...所以如果只需要取其中一部分的数据的时候,建议大家使用切片操作。 什么时候Django会将QuerySet转换为SQL去执行: 生成一个QuerySet对象并不会马上转换为SQL语句去执行。...调用len函数:调用len函数用来获取QuerySet中总共有多少条数据也会执行SQL语句。

    63320

    Django学习笔记之Django ORM Aggregation聚合详解

    (Count('book')) 返回的QuerySet的每个publisher都会带一个属性book_count。...)).filter(num_authors__gt=1) 编写一个包含annotate()和filter()从句的复杂查询时,要特别注意作用于QuerySet的从句的顺序顺序的不同,产生的意义也不同:...在第二个查询中,过滤器在注解之前,所以,在计算注解值时,过滤器就限制了参与运算的对象的范围 order_by() 可以根据聚合值进行排序 >>> Book.objects.annotate(num_authors...=Count('authors')).order_by('num_authors') values() 通常,注解annotate是添加到每一个对象上的,一个执行了注解操作的查询集 QuerySet 所返回的结果中...就不是在原始的 QuerySet 返回结果中对每个对象中添加注解,而是根据定义在 values() 从句中的字段组合对先结果进行唯一的分组,再根据每个分组算出注解值,这个注解值是根据分组中所有的成员计算而得的

    1.1K20

    从入门到精通Django REST Framework-(五)

    GenericAPIView 是 Django REST Framework (DRF) 中的一个基础视图类,它继承自 APIView,并添加了一些常用的功能,特别是与数据库模型交互的功能。...减少重复代码 - 提供了常见操作的标准实现,如获取查询集、序列化数据等提高开发效率 - 内置了分页、过滤、排序等功能代码组织更清晰 - 将通用逻辑与业务逻辑分离易于扩展 - 可以通过重写方法来自定义行为与...GET 请求时,视图调用 get 方法get 方法首先调用 self.get_queryset() 获取基础查询集然后调用 self.filter_queryset() 应用过滤在 filter_queryset...中,首先调用父类方法应用配置的过滤器然后遍历所有查询参数,检查是否与模型字段匹配对于匹配的参数,构建过滤条件并应用到查询集最后序列化过滤后的查询集并返回响应使用示例假设 Book 模型有 title、...title=Django - 过滤标题包含 "Django" 的图书/api/books/?

    7810

    django 1.8 官方文档翻译: 2-5-1 管理器 (初稿)

    (COUNT*)的结果: from django.db import models class PollManager(models.Manager): def with_counts(self...这是因为这种管理器与定义它的模型 绑定得非常紧密,所以继承它们经常会导致异常的结果(特别是默认管理器运行的时候)。 因此,它们不应继承给子类。...要在你的管理器中提供这个功能,要注意以下几点。 不要在这种类型的管理器子类中过滤掉任何结果 一个原因是自动管理器是用来访问关联模型 的对象。...如果你重写了 get_queryset() 方法并且过滤掉了一些行数据,Django 将返回不正确的结果。不要这么做!...你也不应该在模型中使用这个属性之后,在类上改变它。这是因为在模型类被创建时,这个属性值马上就会被处理,而且随后不会再读取这个属性值。

    98120

    Django的Manager和QuerySet

    Django的Manager和QuerySet 要从数据库检索对象,需要通过模型类的 Manager 构建一个 QuerySet。...可以根据给定参数缩小查询结果量。在 SQL 的层面上, QuerySet 对应 SELECT 语句,而filters对应类似 WHERE 或 LIMIT 的限制子句。...在Django的文档中,明确的告诉了开发者,什么时候QuerySet被执行。因为这影响到SQL执行效率。...使用len()函数求QuerySet的长度,比起使用QuerySet的count()方法效率要低一些,count()方法实际对应于数据库的聚合函数COUNT,它是数据库层面的操作,而非python。...QuerySet 类具有两个可用于自省的公开属性: 可以返回QuerySet对象的QuerySet方法 前文所述的看起来做了3次SQL查询,实际上只有一次。

    1.1K30

    Django DjangoFilterBackend django-filter

    djangorestframework==3.8.2 django-filter==2.0.0 #2 需求 获取某些数据时,需要按某些字段过滤 过滤时,有些的字段是 “跨表” 的字段,该如何处理 过滤时...,有些字段是 “区间” 字段(比如时间),该如何处理 过滤时,有些字段是 “跨表” 后的 “区间” 字段,又该如何处理 #3 起步 #3.1 新建一个Django项目 . ├── app │ ├──...#5 跨表过滤 需求:根据老师的名字过滤 class getUserListFilter(django_filters.rest_framework.FilterSet): teaname =...的数值,如果使用queryset.filter(xxx).filter(xxx),那么返回的结果是所有过滤的交集,如果每个自定义函数都返回自己过滤的数据(例如,models.Student.objects.filter...().filter()),那么过滤的结果是所有符合条件的并集 value的正确使用,value.start对应的是url中的min(salary_min),value.stop对应url的max(salary_max

    1.6K20

    Django-官网查询部分翻译(1.11版本文档)-QuerySet-字段查找-06

    你可以给 QuerySet 叠加许多许多过滤条件,但是 django 并不会去执行他们,直到 QuerySet 被 evaluated (检查,评估?...等 pikle 序列化时 触发了 __repr__() 或者 __str__() 时 触发了 __len__() 或者 len() 时 如果你想获取满足条件的数据条数而不需要其他信息,可以使用 .count...() 来更高效的获取数据条数 用 list() 把 QuerySet 强制转换成 list 时 强转成 bool 类型或者 作为 if 条件 时 如果 QuerySet 的查询结果至少有一个(数据对象...新创建的 QuerySet 的缓存(cache)是空的,QuerySet 第一次取值执行(evaluatad)的时候进行数据库查询操作,Django 会将查询结果保存到 QuerySet 的 cache...=False) 过滤字段 .none() 创建空的 QuerySet 调用 .none() 方法会创建一个空的 QuerySet ,里面不包含任何数据对象,并且在取值时也不会执行任何数据库操作(是 EmptyQuerySet

    2.9K20

    django 自带分页功能

    EmptyPage: That page contains no results 注意 注意你可以向Paginator提供一个列表或元组,Django的QuerySet,或者任何带有count()或__...当计算传入的对象所含对象的数量时,Paginator会首先尝试调用count(),接着如果传入的对象没有count()方法则回退调用 len()。...这样的话如果对象存在count(),比如Django的QuerySet,就可以使用更加高效的 count() 使用 Paginator 这里有一些复杂一点的例子,它们在视图中使用 Paginator 来为查询集分页... QuerySet, or other sliceable object with a count() or __len__() method. per_page The maximum number...这样会使类似于Django’s QuerySet的对象使用更加便捷的count()方法,如果存在的话。 Paginator.num_pages¶ 页面总数。

    93710

    【Django】Django ORM 学习笔记

    优缺点 使用 ORM 最大的优点就是快速开发,让我们将更多的精力放在业务上而不是数据库上,下面是 ORM 的几个优点 隐藏了数据访问细节,使通用数据库交互变得简单易行。...从数据库中查询出来的结果一般是一个集合,这个集合称为 QuerySet。...QuerySet exclude(**kwargs) - 获得不满足查询条件的 QuerySet get(**kwargs) — 从数据库中获得一个匹配的结果(一个实例),如果没有匹配结果或者匹配结果大于一个都会报错...当首次对 QuerySet 的所有实例进行求值时,会将查询结果保存到 QuerySet 的缓冲中。当再访问该 QuerySet 时,会直接从缓冲中取数据。...关联大体上可以分为两种: 只有一个关联实例: 外键关联中包含外键的表、OneToOneField,例如下图中的 orm_blog 只与一个 orm_author 的实例关联 有多个关联实例:外键关联中不含外键的表

    2.2K20
    领券