美文网首页django
对查询集去重distinct(*fields)

对查询集去重distinct(*fields)

作者: 陆_志东 | 来源:发表于2018-09-11 23:14 被阅读148次

对查询集调用distinct,来实现对查询集的去重.
在sql中的体现就是使用了SELECT DISTINCT 语句
在默认的情况下,django查询集是不会默认去重的,像Blog.objects.all()这样的查询不会引入重复的行.只有在多表查询时会出现重复的行.这时候可以使用distinct()去重

注意

  • 1.需要注意distinctvalues,会影响结果的唯一性,因为values限制了比较的字段.默认全字段比较
    同理distinct设置字段参数,也将影响结果唯一性,因为distinct设置字段参数后,将只比较设置的字段.默认是全字段比较.
    举例:上面的话的意思是如果一个模型有5个字段,两条数据只有3个字段是重复的,默认这两条数据是不重复的,因为还有两个字段不同.如果你使用values或者distinct指定了这3个重复的字段,那么这两条数据就会被认为是重复的.因为使用valuesdistinct之后会只比较这三个字段而不是全部字段,也就是影响了结果的唯一性
  • 2.distinct和order by 一起使用时,需要注意下面两种情况
    • distinct指定限制了去重的字段(非外键字段).这个时候你需要保证distinct设置的字段要和order by排序的字段保持一致,如果指定了多个字段,还要保证顺序一致.
      示例: Entry.objects.order_by('pub_date').distinct('pub_date')
    • 如果distinct指定了外键字段.order by 需要和外键字段指向的模型使用的默认排序字段一致.django中任意模型如果指定排序方式,就会使用默认的id字段排序,如果元类设置定义了排序方法,就需要使用元类设置的排序方法
      示例:下面示例的前提是Entry通过外键字段blog关联了Blog模型类
      没有设置排序的Blog模型类演示:
      Entry.objects.order_by('blog__id').distinct('blog') or Entry.objects.order_by('blog__pk').distinct('blog')
      Blog模型设置了以自身的name字段排序演示:``Entry.objects.order_by('blog__name').distinct('blog')

相关文章

网友评论

    本文标题:对查询集去重distinct(*fields)

    本文链接:https://www.haomeiwen.com/subject/bbolwftx.html