django ORM之values和annotate使用详解
任务需求:项目中有个问题表,存储所有的问题,以_id为编号,由于_id未做唯一校验,所以早期数据有多个问题使用同一编号的情况。
需求就是找出编号有重复的数据,只保留第一个
开始之前
使用了values和annotate两个函数
简单的来说values可以理解成展示models指定列的值
annotate起到了group by的作用,
所以我做的事就是对指定字段按个数进行统计,然后留下重复编号的数据,进行清洗
看看数据库数据
查看每条数据的_id的值
对_id数据条数进行统计
转换数据格式为list
Emmm。。。我只需要重复数据,所以把_id唯一的数据剔除
写个简单的遍历
然后只需要找到这些数据,对每个_id只留下第一条数据
导出sql,做个备份,开始删除数据
最终处理:
删除过程:
再回到网站看看数据清洗后的效果
补充知识: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实现地址和经纬度转换