如何使用djangoORM中values和annotate-创新互联

这篇文章主要为大家展示了如何使用django ORM中values和annotate,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。

创新互联公司-专业网站定制、快速模板网站建设、高性价比庐山网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式庐山网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖庐山地区。费用合理售后完善,十载实体公司更值得信赖。

任务需求:项目中有个问题表,存储所有的问题,以_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 %}
  {{ category.name }}
  {{ category.news_set.count }}
 {% endfor %}

分享题目:如何使用djangoORM中values和annotate-创新互联
文章出自:http://ybzwz.com/article/pspep.html