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切片知识解析
Mar 06 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
Jul 25 Python
Python实现运行其他程序的四种方式实例分析
Aug 17 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
Feb 21 Python
django利用request id便于定位及给日志加上request_id
Aug 26 Python
使用Python实现跳帧截取视频帧
May 31 Python
Django接收自定义http header过程详解
Aug 23 Python
pytorch的batch normalize使用详解
Jan 15 Python
python实现门限回归方式
Feb 29 Python
Python 实现将某一列设置为str类型
Jul 14 Python
python中翻译功能translate模块实现方法
Dec 17 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
thinkphp实现分页显示功能
2016/12/03 PHP
php实现mysql连接池效果实现代码
2018/01/25 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
2019/05/13 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
jQuery each()小议
2010/03/18 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
详解AngularJS中自定义指令的使用
2015/06/17 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
Bootstrap进度条组件知识详解
2016/05/01 Javascript
Vue实现百度下拉提示搜索功能
2017/06/21 Javascript
JS实现的全选、全不选及反选功能【案例】
2019/02/19 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
理解Python中函数的参数
2015/04/27 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
2016/05/17 Python
Python unittest单元测试框架总结
2018/09/08 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
Python找出列表中出现次数最多的元素三种方式
2020/02/24 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
中专毕业生自荐信范文
2013/11/28 职场文书
学校招生宣传广告词
2014/03/19 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
无线电知识基础入门篇
2022/02/18 无线电