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系列之教你如何根据图片生成字符画
May 23 Python
在Python中用split()方法分割字符串的使用介绍
May 20 Python
Python插件virtualenv搭建虚拟环境
Nov 20 Python
怎么使用pipenv管理你的python项目
Mar 12 Python
对python中执行DOS命令的3种方法总结
May 12 Python
使用Python监视指定目录下文件变更的方法
Oct 15 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
详解Python静态网页爬取获取高清壁纸
Apr 23 Python
Django使用Jinja2模板引擎的示例代码
Aug 09 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
Python基础之pandas数据合并
Apr 27 Python
python3实现Dijkstra算法最短路径的实现
May 12 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
咖啡与牛奶
2021/03/03 冲泡冲煮
PHP goto语句简介和使用实例
2014/03/11 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
php pthreads多线程的安装与使用
2016/01/19 PHP
php实现头像上传预览功能
2017/04/27 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
json简单介绍
2008/06/10 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
2019/09/20 Javascript
vue使用原生swiper代码实例
2020/02/05 Javascript
vue-resource post数据时碰到Django csrf问题的解决
2020/03/13 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
Python中的localtime()方法使用详解
2015/05/22 Python
用tensorflow搭建CNN的方法
2018/03/05 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
python flask安装和命令详解
2019/04/02 Python
Django 路由控制的实现
2019/07/17 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
pytorch点乘与叉乘示例讲解
2019/12/27 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
2021/01/05 Python
浅谈matplotlib默认字体设置探索
2021/02/03 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
经典c++面试题二
2015/08/14 面试题
工程学毕业生自荐信
2014/06/14 职场文书
社会实践活动总结格式
2015/05/11 职场文书