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进行基础的函数式编程的教程
Mar 31 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
11月编程语言排行榜 Python逆袭C#上升到第4
Nov 15 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
Python实现的简单排列组合算法示例
Jul 04 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
Python列表切片操作实例总结
Feb 19 Python
如何在Django配置文件里配置session链接
Aug 06 Python
Python函数基本使用原理详解
Mar 19 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中取得image按钮传递的name值
2006/10/09 PHP
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
2017/01/13 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
Javascript 学习书 推荐
2009/06/13 Javascript
围观tangram js库
2010/12/28 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
javascript表单验证 - Parsley.js使用和配置
2013/01/25 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
2017/07/11 Javascript
Vue集成Iframe页面的方法示例
2017/12/12 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
在vue中给列表中的奇数行添加class的实现方法
2018/09/05 Javascript
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
taro小程序添加骨架屏的实现代码
2019/11/15 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
Python Web框架Tornado运行和部署
2020/10/19 Python
python多线程使用方法实例详解
2019/12/30 Python
python3中使用__slots__限定实例属性操作分析
2020/02/14 Python
草莓巧克力:Shari’s Berries
2017/02/07 全球购物
简短的公司员工自我评价分享
2013/11/13 职场文书
《云雀的心愿》教学反思
2014/02/25 职场文书
五年级学生评语
2014/04/22 职场文书
城市轨道交通工程职业生涯规划书范文
2014/09/16 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS
基于docker安装zabbix的详细教程
2022/06/05 Servers