有时候想用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") 查询函数可以混合使用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") 查询函数可以混合使用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()函数。
需求就是找出编号有重复的数据,只保留第一个 开始之前 使用了values和annotate两个函数 简单的来说values可以理解成展示models指定列的值 annotate起到了group by的作用...补充知识:django中annotate的一点使用方法 annotate 使用方法: 有时候我们需要连接两个表做一些查询,比如博客中有两个模型,一个文章模型,一个分类模型,分类模型是文章中的分类字段的外键...categories = NewsCategory.objects.annotate(num_count=Count(‘news’)) annotate中其实是给categories(Queryset...)添加了一个属性,Queryset中的每个对象都会有这么一个属性 现在可以这样查询分类下的文章数量: category.num_count() 将代码贴出来 原先的代码: def cms_news_category...}}</td {% endfor %} 以上这篇django ORM之values和annotate使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考。
此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)...换句话说,在关联的任何一端,都不需要再调用save()方法。 聚合查询和分组查询 聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。...>>> models.Book.objects.annotate(author_num=Count("author")).order_by("author_num") 查询函数可以混合使用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() 子句时,过滤器有限制注解对象的作用。...本质上,可以创建、过滤、切片和传递查询集而不用真实操作数据库。
) 这样以后咱如果要删除一条数据了,就设置一下 is_delete=1 就表示这条数据在逻辑上删除了,简单的说就是你再怎么搜数据库也搜不到了,如果以后还用,就再设置 is_delete=0...补充知识:django中当model设置了ordering后,使用distinct()和annotate()问题记录 model类如下,我在class Meta中设置了ordering = [‘-date_create...("host_name").annotate(dcount=Count(1)) p <QuerySet [{'host_name': '点2', 'dcount': 1}, {'host_name...`date_create` DESC 可以看到,所得到的结果并不像我们预期的一样,之后把执行的sql输出出来可以看到在group by的时候是对host_name和date_create进行分组,原因就是因为我们在...使用distinct和上面的情况类似,就不列出来了。 以上这篇django orm模块中的 is_delete用法就是小编分享给大家的全部内容了,希望能给大家一个参考。
前言 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会强制它再次提交数据库操作,进行重复查询。
领取专属 10元无门槛券
手把手带您无忧上云