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中dir函数用法分析
Apr 17 Python
python从网络读取图片并直接进行处理的方法
May 22 Python
在Linux下使用Python的matplotlib绘制数据图的教程
Jun 11 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Aug 08 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
Python函数和模块的使用总结
May 20 Python
python科学计算之narray对象用法
Nov 25 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
DRF使用simple JWT身份验证的实现
Jan 14 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
Mar 03 Python
Python中else的三种使用场景
Jun 16 Python
python 进阶学习之python装饰器小结
Sep 04 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 smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
基于jquery的从一个页面跳转到另一个页面的指定位置的实现代码(带平滑移动的效果)
2011/05/24 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
jquery.form.js用法之清空form的方法
2014/03/07 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
javascript手工制作悬浮菜单
2015/02/12 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
python发送arp欺骗攻击代码分析
2014/01/16 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
在python中实现对list求和及求积
2018/11/14 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
Python创建数字列表的示例
2019/11/28 Python
python学习笔记之多进程
2020/08/06 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
造价工程师个人求职信
2013/09/21 职场文书
毕业自我鉴定
2013/11/05 职场文书
4s店总经理岗位职责
2013/12/31 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
生活委员竞选稿
2015/11/21 职场文书
2019自荐信范文集锦!
2019/07/03 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
关于nginx 实现jira反向代理的问题
2021/09/25 Servers
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js