Django model distinct 的使用方法

Posted robinunix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django model distinct 的使用方法相关的知识,希望对你有一定的参考价值。

原文:

今天突然有人问起在 django 的 model 里面怎么用 distinct, 对于这种东西,我一向的观点是查看django 的在线文档。于是不加思索的根据在线文档给出了答案,但结果很让人沮丧,运行程序时会报错: NotImplementedError: DISTINCT ON fields is not supported by this database backend, 从字面上看,貌似是因为才用了mysql 的原因,其实不是.

django 在线文档讲解 distinct 的连接如下:
https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct
里面是这么讲解  distinct 的

>>> Author.objects.distinct()
[...]

>>> Entry.objects.order_by(‘pub_date‘).distinct(‘pub_date‘)
[...]

>>> Entry.objects.order_by(‘blog‘).distinct(‘blog‘)
[...]

>>> Entry.objects.order_by(‘author‘, ‘pub_date‘).distinct(‘author‘, ‘pub_date‘)
[...]

>>> Entry.objects.order_by(‘blog__name‘, ‘mod_date‘).distinct(‘blog__name‘, ‘mod_date‘)
[...]

>>> Entry.objects.order_by(‘author‘, ‘pub_date‘).distinct(‘author‘)

于是我按照这样做了一个,结果就出现上面的错误了.

真正的做法是这样的,如果用mysql 的话,distinct() 里面不要任何参数,参数应该写在 value 中去,类似如下方式:

if __name__ == "__main__":
    a = Category.objects.values(‘parentcode‘,‘email‘).distinct()
    for obj in a:
        print obj

这表示按照 parentcode,email 组合去除重复的内容.
如果是这样:

if __name__ == "__main__":
    a = Category.objects.values(‘parentcode‘).distinct()
    for obj in a:
        print obj

就表示按照 parentcode 去除重复的内容。  

 

以上是关于Django model distinct 的使用方法的主要内容,如果未能解决你的问题,请参考以下文章

django ORM model filter 条件过滤,及多表连接查询反向查询,某字段的distinct

SQL COUNT(DISTINCT <column>) 的 Django ORM 版本

在 Django 中使用带有 GROUP BY 子句的 COUNT(DISTINCT 字段)

Django Model - 获取不同的值列表

DJANGO:如何使用包含 order_by 的模型创建管理视图?

Django Query distinct values 有效,但我无法使用查询结果