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调用cmd复制文件代码分享
Dec 27 Python
python处理cookie详解
Feb 07 Python
Python中每次处理一个字符的5种方法
May 21 Python
Python实现堆排序的方法详解
May 03 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
python验证码识别教程之滑动验证码
Jun 04 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
python写程序统计词频的方法
Jul 29 Python
在pytorch中查看可训练参数的例子
Aug 18 Python
Python利用Scrapy框架爬取豆瓣电影示例
Jan 17 Python
Python搭建Keras CNN模型破解网站验证码的实现
Apr 07 Python
python实时监控logstash日志代码
Apr 27 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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
[原创]后缀就扩展名为js的文件是什么文件
2007/12/06 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
2016/10/07 Javascript
React中使用外部样式的3种方式(小结)
2019/05/28 Javascript
微信小程序开发之map地图组件定位并手动修改位置偏差
2019/08/17 Javascript
解决vue组件销毁之后计时器继续执行的问题
2020/07/21 Javascript
[40:50]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第四场
2014/05/24 DOTA
Python中使用动态变量名的方法
2014/05/06 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
python 对象和json互相转换方法
2018/03/22 Python
python得到单词模式的示例
2018/10/15 Python
Python selenium根据class定位页面元素的方法
2019/02/26 Python
tensorflow自定义激活函数实例
2020/02/04 Python
Tensorflow tf.tile()的用法实例分析
2020/05/22 Python
keras-siamese用自己的数据集实现详解
2020/06/10 Python
基于python实现操作git过程代码解析
2020/07/27 Python
python缩进长度是否统一
2020/08/02 Python
Python中实现一行拆多行和多行并一行的示例代码
2020/09/06 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
python 获取谷歌浏览器保存的密码
2021/01/06 Python
浅析HTML5:'data-'属性的作用
2018/01/23 HTML / CSS
当当网官方旗舰店:中国图书销售夺金品牌
2018/04/02 全球购物
计算机应用专业推荐信
2013/11/13 职场文书
计算机毕业大学生推荐信
2013/12/01 职场文书
司机工作自我鉴定
2014/09/19 职场文书
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android
ICOM R71E和R72E图文对比解说
2022/04/07 无线电
MySQL外键约束(Foreign Key)案例详解
2022/06/28 MySQL