django ORM之values和annotate使用详解


Posted in Python onMay 19, 2020

任务需求:项目中有个问题表,存储所有的问题,以_id为编号,由于_id未做唯一校验,所以早期数据有多个问题使用同一编号的情况。

需求就是找出编号有重复的数据,只保留第一个

开始之前

使用了values和annotate两个函数

简单的来说values可以理解成展示models指定列的值

annotate起到了group by的作用,

所以我做的事就是对指定字段按个数进行统计,然后留下重复编号的数据,进行清洗

看看数据库数据

django ORM之values和annotate使用详解

查看每条数据的_id的值

django ORM之values和annotate使用详解

对_id数据条数进行统计

django ORM之values和annotate使用详解

转换数据格式为list

django ORM之values和annotate使用详解

Emmm。。。我只需要重复数据,所以把_id唯一的数据剔除

写个简单的遍历

django ORM之values和annotate使用详解

然后只需要找到这些数据,对每个_id只留下第一条数据

导出sql,做个备份,开始删除数据

最终处理:

django ORM之values和annotate使用详解

删除过程:

django ORM之values和annotate使用详解

再回到网站看看数据清洗后的效果

django ORM之values和annotate使用详解

补充知识:django中annotate的一点使用方法

annotate 使用方法:

有时候我们需要连接两个表做一些查询,比如博客中有两个模型,一个文章模型,一个分类模型,分类模型是文章中的分类字段的外键,如果我们需要查询每个分类下文章的数量,最简单的方法就是先将所有分类查到:

categories = NewsCategory.objects.all()

文章模型名称为News

然后每个分类django都会自动给你添加一个属性category.news_set,这个方法就可以拿到分类对应的文章,然后category.news_set.count()就可以拿到每个分类有多少个文章了。

但是这个方法很低级啊,如果想高级一点,查询性能更优化,annotate了解一下

现在就可以对上面的查询方法进行优化了。

categories = NewsCategory.objects.annotate(num_count=Count('news'))

annotate中其实是给categories(Queryset)添加了一个属性,Queryset中的每个对象都会有这么一个属性

现在可以这样查询分类下的文章数量:

category.num_count()

将代码贴出来

原先的代码:

def cms_news_category(request):
 categories = NewsCategory.objects.all()
 context = {
  'categories': categories
 }
 return render(request, 'cms/category.html', context=context)
 
 模板category.html中的代码:
 {% for category in categories %}
  <td>{{ category.name }}</td>
  <td>{{ category.news_set.count }}</td>
 {% endfor %}

使用annotate后的代码:

def cms_news_category(request):
 categories = NewsCategory.objects.annotate(num_count=Count('news'))
 context = {
  'categories': categories
 }
 return render(request, 'cms/category.html', context=context)
 模板category.html中的代码: 
 {% for category in categories %}
  <td>{{ category.name }}</td>
  <td>{{ category.num_count }}</td>
 {% endfor %}

以上这篇django ORM之values和annotate使用详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python matlibplot绘制3D图形
Jul 02 Python
Random 在 Python 中的使用方法
Aug 09 Python
用python实现k近邻算法的示例代码
Sep 06 Python
python中退出多层循环的方法
Nov 27 Python
Python常用的json标准库
Feb 19 Python
selenium处理元素定位点击无效问题
Jun 12 Python
python线程中的同步问题及解决方法
Aug 29 Python
将python安装信息加入注册表的示例
Nov 20 Python
python 回溯法模板详解
Feb 26 Python
Python使用pyyaml模块处理yaml数据
Apr 14 Python
python中对列表的删除和添加方法详解
Feb 24 Python
python通过新建环境安装tfx的问题
May 20 Python
基于python实现地址和经纬度转换
May 19 #Python
Python Django form 组件动态从数据库取choices数据实例
May 19 #Python
Django自关联实现多级联动查询实例
May 19 #Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 #Python
django 数据库返回queryset实现封装为字典
May 19 #Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
May 19 #Python
python 数据分析实现长宽格式的转换
May 18 #Python
You might like
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
浅析PHP Socket技术
2013/08/02 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
基于PHP后台的Android新闻浏览客户端
2016/05/23 PHP
Laravel下生成验证码的类
2017/11/15 PHP
如何从jQuery的ajax请求中删除X-Requested-With
2013/12/11 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
2013/12/16 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
JavaScript构建自己的对象示例
2016/11/29 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
Python中Continue语句的用法的举例详解
2015/05/14 Python
python实现Decorator模式实例代码
2018/02/09 Python
解析python实现Lasso回归
2019/09/11 Python
python 进程池pool使用详解
2020/10/15 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
会计电算化应届生求职信
2013/11/03 职场文书
优秀中专生推荐信
2013/11/17 职场文书
我的梦想演讲稿500字
2014/08/21 职场文书
高中学校对照检查材料
2014/08/31 职场文书
解除施工合同协议书
2014/10/17 职场文书
二手房购房意向书
2015/05/09 职场文书
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle