有时候想用distinct去掉queryset中的重复项,看django文章中是这么说的 >>> Author.objects.distinct() [...] >>> Entry.objects.order_by...('pub_date').distinct('pub_date') [...] >>> Entry.objects.order_by('blog').distinct('blog') [...] >>>...Note django文档中特别介绍了,distinct的列一定要先order_by并且在第一项。...When you specify field names, you must provide an order_by() in the QuerySet, and the fields in order_by...的话,在distinct前面加上values或values_list u.comment_set.values("forum").distinct() [{'forum': 1L}, {'forum'
本主题指南介绍如何使用Django查询生成和返回聚合值。...在此示例中,将计算Book模型上价格字段的平均值。可以在QuerySet引用中找到可用聚合函数的列表。 Aggregate()是QuerySet的一个结束语句。...在聚合函数中指定聚合字段时,Django允许您在筛选相关字段时使用相同的双下划线符号。Django将处理需要检索和聚合相关值的任何表连接。...(num_authors=Count('authors')) annotate()和filter()子句的顺序¶ 在开发涉及annotate()和filter()子句的复杂查询时,请特别注意应用于QuerySet...这实际上意味着filter()和annotate()不是可互换的操作。 例如: 出版商A有两本评分为4和5的书。 出版商B有两本评分为1和4的书。 出版商C有一本评分为1的书。
每个对象的总结可以用方法annotate()生成: # 建立一个annotate QuerySet >>> from django.db.models import Count >>> q = Book.objects.annotate...Aggregations and other QuerySet clauses filter() and exclude() 聚合可以和filter和exclude一起使用: >>> from django.db.models...(num_authors=Count('authors')).filter(num_authors__gt=1) 编写一个包含annotate()和filter()从句的复杂查询时,要特别注意作用于QuerySet...=Count('authors')).order_by('num_authors') values() 通常,注解annotate是添加到每一个对象上的,一个执行了注解操作的查询集 QuerySet 所返回的结果中...(Count("id")) 这部分代码想通过使用它们公共的data值来分组Item对象,然后在每个分组中得到id值的总数。
Queryset queryset技巧 #1 aggregate models.py from django.db import models class Author(models.Model):...计数 >>> from django.db.models import Count >>> models.Book.objects.all().aggregate(Count('id')) {'id_..._count': 10} #2 annotate aggregate 计算整个queryset的值,相当于count(). annotate 对于 queryset 中的每个值在指定的属性上进行汇总,...相当于group_by >>> from django.db.models import Count >>> pubs = Publisher.objects.annotate(num_books=...[0].num_books 73 annotate返回的是一个queryset对象,queryset对象中的每一个obj新增了一个属性(这里新增了num_books属性),这个属性的值就是这个对象Count
此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。) count(): 返回数据库中匹配查询(QuerySet)的对象数量。... QuerySet进行排序 >>> models.Book.objects.annotate(author_num=Count("author")).order_by("author_num") QuerySet...[('番茄物语',)]> 查询函数可以混合使用Q 对象和关键字参数。...('nid').distinct() # select distinct nid from userinfo 注:只有在PostgreSQL中才能使用distinct进行去重 def...# extra # 在QuerySet的基础上继续执行子语句 # extra(self, select=None, where=None, params=None, tables=None, order_by
此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)...换句话说,在关联的任何一端,都不需要再调用save()方法。 聚合查询和分组查询 聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。...>>> models.Book.objects.annotate(author_num=Count("author")).order_by("author_num") QuerySet [<Book...ORM执行原生SQL # extra # 在QuerySet的基础上继续执行子语句 # extra(self, select=None, where=None, params=None, tables...('nid').distinct() # select distinct nid from userinfo 注:只有在PostgreSQL中才能使用distinct进行去重 def
此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)...>>> models.Book.objects.annotate(author_num=Count("author")).order_by("author_num") QuerySet [ 查询函数可以混合使用Q 对象和关键字参数。...ORM执行原生SQL # extra # 在QuerySet的基础上继续执行子语句 # extra(self, select=None, where=None, params=None, tables...('nid').distinct() # select distinct nid from userinfo 注:只有在PostgreSQL中才能使用distinct进行去重 def
(num_books=Count('book')).order_by('-num_books')[:5] >>> pubs[0].num_books 1323 在查询集上生成聚合 Django提供了两种生成聚合的方法...当annotate()子句被指定之后,QuerySet中的每个对象都会被注上特定的值。 这些注解的语法都和aggregate()子句所使用的相同。...Practical Django Projects> >>> q[1].authors__count 1 和使用 aggregate()一样,注解的名称也根据聚合函式的名称和聚合字段的名称得到的。...像使用其他模型字段一样,注解也可以在filter()和exclude() 子句中使用别名。...注意 你可能想知道为什么 Django 不删除与你无关的列。主要原因就是要保证使用 distinct()和其他方法的一致性。
Django ORM执行原生SQL # extra # 在QuerySet的基础上继续执行子语句 # extra(self, select=None, where=None, params=None,...对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。...def annotate(self, *args, **kwargs) # 用于实现聚合group by查询 from django.db.models import Count, Avg...('nid').distinct() # select distinct nid from userinfo 注:只有在PostgreSQL中才能使用distinct进行去重 def...终端打印SQL语句 在Django项目的settings.py文件中,在最后复制粘贴如下代码:即为你的Django项目配置上一个名为django.db.backends的logger实例即可查看翻译后的
1.5 len() 计算QuerySet元素的数量,并不推荐使用len(),除非QuerySet是求过值的(即evaluated),否则,用QuerySet.count()获取元素数量,这个效率要高。...2.4.3 annotate(无对应SQL关键字) 函数原型annotate(*args, **kwargs) 返回QuerySet 往每个QuerySet的model instance中加入一个或多个字段...,字段值只能是聚合函数,因为使用annotate时,会用group by,所以只能用聚合函数。....distinct() 对应的SQL分别为 select distinct name from Author 和 select distinct name,email from Author 2.4.6...该函数与annotate()有何区别呢?annotate相当于aggregate()和group by的结合,对每个group执行aggregate()函数。
此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)...换句话说,在关联的任何一端,都不需要再调用save()方法。 聚合查询和分组查询 聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。...>>> models.Book.objects.annotate(author_num=Count("author")).order_by("author_num") QuerySet [ 查询函数可以混合使用Q 对象和关键字参数。...ORM执行原生的SQL # extra # 在QuerySet的基础上继续执行子语句 # extra(self, select=None, where=None, params=None, tables
此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)...换句话说,在关联的任何一端,都不需要再调用save()方法。 聚合查询和分组查询 聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。...>>> models.Book.objects.annotate(author_num=Count("author")).order_by("author_num") QuerySet [<Book...')) Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。...[('番茄物语',)]> 查询函数可以混合使用Q 对象和关键字参数。
() 解释:对查询结果去重 语法:ModelName.objects.all().distinct() 例子:Author.objects.all().distinct() 8.values(*fields...).first() 例子:Author.objects.filter(name="xiaol").last() 关联查询: 方法:使用两个下划线(__)可以进行关联查询 例子:查询AutherDetail...的信息 语法:AuthorDetail.objects.filter(id="2").values("sex","email", "author__name") 聚合查询:需要引入from django.db.models...="xiaol").aggregate(myCount=Count('id')) 分组查询:需要引入from django.db.models import * 方法:使用aggreagte关键字 用法...:xxx.filter(分组字段).annotate(分组后操作) 语法:Author.objects.filter(name="xiaol").annotate(myCount=Count('id')
annotate annotate:给QuerySet中的每个对象都添加一个使用查询表达式(聚合函数、F表达式、Q表达式、Func表达式等)的新字段。...默认情况下会把表中所有的字段全部都提取出来,可以使用values来进行指定,并且使用了values方法后,提取出的QuerySet中的数据类型不是模型,而是在values方法中指定的字段和值形成的字典:...因为count在底层是使用select count(*)来实现的,这种方式比使用len函数更加的高效。...如果要判断某个条件的元素是否存在,那么建议使用exists,这比使用count或者直接判断QuerySet更有效得多。...Django将QuerySet转换为SQL语句去执行的五种情况 迭代:在遍历QuerySet对象的时候,会首先先执行这个SQL语句,然后再把这个结果返回进行迭代。
当annotate()子句被指定之后,QuerySet中的每个对象都会被注上特定的值。这些注解的语法都和aggregate()子句所使用的相同。...# Build an annotated queryset >>> from django.db.models import Count >>> q = Book.objects.annotate(Count...发现aggregate 和 annotate用法的区别了吗,再次举例如下(在聚合函数中指定聚合字段时,Django 允许你使用同样的 双下划线 表示关联关系,): >>> from django.db.models...__startswith="Django").annotate(num_authors=Count('authors')) # 使用annotate() 子句时,过滤器有限制注解对象的作用。...本质上,可以创建、过滤、切片和传递查询集而不用真实操作数据库。
前言 Django后台列表的自定义过滤条件显示,记录太多。只显示有用的信息。 自定义管理模型类 比如端口信息有很多,只显示存在线主机开放的端口信息。...= Host.objects.filter(open_ports__in=[obj]).annotate(num_hosts=Count('id')).values('num_hosts')...if host_count: return host_count[0]['num_hosts'] else: return 0...) queryset = queryset.annotate(num_hosts=Count('s_port')).filter(num_hosts__gt=0) # 过滤出 num_hosts...request, model_admin): open_ports = set(Host.objects.values_list('open_ports__port', flat=True).distinct
他的方法全部都是通过Python动态添加的方式,从QuerySet类中拷贝过来的。 所以我们如果想要学习ORM模型的查找操作,必须首先要学会QuerySet上的一些API的使用。...annotate:给QuerySet中的每个对象都添加一个使用查询表达式(聚合函数、F表达式、Q表达式、Func表达式等)的新字段。...默认情况下会把表中所有的字段全部都提取出来,可以使用values来进行指定,并且使用了values方法后,提取出的QuerySet中的数据类型不是模型,而是在values方法中指定的字段和值形成的字典:...如果想要知道总共有多少条数据,那么建议使用count,而不是使用len(articles)这种。因为count在底层是使用select count(*)来实现的,这种方式比使用len函数更加的高效。...first和last:返回QuerySet中的第一条和最后一条数据。 aggregate:使用聚合函数。 exists:判断某个条件的数据是否存在。
exclude() 排除满足条件的对象 annotate() 使用聚合函数 order_by() 对查询集进行排序 reverse() 反向排序 distinct() 对查询集去重...例如,如果正在操作一个Blog列表,你可能想知道每个Blog有多少Entry: >>> from django.db.models import Count >>> q = Blog.objects.annotate...当查询跨越多张表的数据时,QuerySet可能得到重复的结果,这时候可以使用distinct()进行去重。...21. using() using(alias) 如果正在使用多个数据库,这个方法用于指定在哪个数据库上查询QuerySet。方法的唯一参数是数据库的别名,定义在DATABASES。...对于返回大量只需要访问一次的对象的QuerySet,这可以带来更好的性能,显著减少内存使用。 请注意,在已经提交了的iterator()上使用QuerySet会强制它再次提交数据库操作,进行重复查询。
有一些限制条件是Django提供的,并没有数据库层面的对应物,比如blank。 (当blank参数为真时,对应字段可以为留为空白。) 在基本的模型设计上,Django ORM没有留什么坑。...需要注意的是,在Django ORM中,只能通过ForeignKey来定义多对一关系,不能显示地定义一对多关系。但你可以使用模型对象的*_set语法来反向调用多对一关系。...返回QuerySet的常见方法包括: all() filter() exclude() annotate() order_by() reverse() distinct() ......此外QuerySet一些方法,比get()、count()、earlist()、exists()等,都会对QuerySet进行求值。...聚合的aggregate()和annotate()方法可以实现基本的功能,但稍微复杂一点,代码就变得魔幻了: ? 看到一大串values()、annotate()变来变去,有没有觉得头晕?
Django ORM用到三个类:Manager、QuerySet、Model。...QuerySet实例 就是从数据库根据自己要求拿数据的 连数据都那不出来,写啥视图 所以在编写queryset必须用django shell 调试 在model中,Django通过给Model增加一个objects...exclude() 排除满足条件的对象 annotate() 使用聚合函数 order_by() 对查询集进行排序 reverse() 反向排序 distinct() 对查询集去重...的aggregate和annotate方法属于高级查询方法,主要用于组合查询,是Django高手们必需要熟练掌握的。...当我们需要对查询集(queryset)的某些字段进行计算或进行先分组再计算或排序, 我们就需要使用aggregate和annotate方法了。
领取专属 10元无门槛券
手把手带您无忧上云