如何使用django ORM和注释中值

  

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

任务需求:项目中有个问题表,存储所有的问题,以_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(请求):
  类别=NewsCategory.objects.all ()
  上下文={
  & # 39;类别# 39;:类别
  }
  返回渲染(请求,& # 39;cms/category.html& # 39;,上下文=上下文)
  
  模板category.html中的代码:
  {%类别的类别%}
  & lt; td> {{category.name}} & lt;/td>
  & lt; td> {{category.news_set。数}}& lt;/td>
  {% endfor %} 

使用注释后的代码:

 def cms_news_category(请求):
  类别=NewsCategory.objects.annotate (num_count=Count(& # 39;新闻# 39;))
  上下文={
  & # 39;类别# 39;:类别
  }
  返回渲染(请求,& # 39;cms/category.html& # 39;,上下文=上下文)
  模板category.html中的代码:
  {%类别的类别%}
  & lt; td> {{category.name}} & lt;/td>
  & lt; td>{{类别。num_count}} & lt;/td>
  {% endfor %} 

以上就是关于如何使用django ORM中值和注释的内容,如果你们有学习到知识或者技能,可以把它分享出去让更多的人看的到。

如何使用django ORM和注释中值