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比较2个xml内容的方法
May 11 Python
Python实现类的创建与使用方法示例
Jul 25 Python
Python基于回溯法子集树模板解决数字组合问题实例
Sep 02 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
Python学习笔记之文件的读写操作实例分析
Aug 07 Python
使用python3批量下载rbsp数据的示例代码
Dec 20 Python
详解python中各种文件打开模式
Jan 19 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 Python
Python同时处理多个异常的方法
Jul 28 Python
浅谈python锁与死锁问题
Aug 14 Python
基于Python实现股票收益率分析
Apr 02 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
人族 Terran 魔法与科技
2020/03/14 星际争霸
人大复印资料处理程序_查询篇
2006/10/09 PHP
PHP 输出简单动态WAP页面
2009/06/09 PHP
PHP正确配置mysql(apache环境)
2011/08/28 PHP
谈谈关于php的优点与缺点
2013/04/11 PHP
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
2016/08/08 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
AngularJS ng-bind 指令简单实现
2016/07/30 Javascript
利用vue.js插入dom节点的方法
2017/03/15 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
JavaScript中Object基础内部方法图
2018/02/05 Javascript
AngularJS自定义过滤器用法经典实例总结
2018/05/17 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
python取余运算符知识点详解
2019/06/27 Python
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
什么是接口(Interface)?
2013/02/01 面试题
个性大学生自我评价
2013/12/04 职场文书
电焊工岗位工作职责
2014/07/09 职场文书
关于成绩下滑的自我检讨书
2014/09/20 职场文书
大学拉赞助协议书范文
2014/09/26 职场文书
英语导游欢迎词
2015/09/30 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
Js类的构建与继承案例详解
2021/09/15 Javascript
基于PyQt5制作一个群发邮件工具
2022/04/08 Python