Django:根据注释获取重复项

时间:2017-10-25 13:37:37

标签: python django duplicates django-annotate

我希望根据不区分大小写的字段值获取所有重复项。

基本上要重写这个SQL查询

SELECT count(*), lower(name)
FROM manufacturer
GROUP BY lower(name)
HAVING count(*) > 1;

使用Django ORM。我希望像这样的东西可以做到这一点

from django.db.models import Count
from django.db.models.functions import Lower

from myapp.models import Manufacturer


qs = Manufacturer.objects.annotate(
    name_lower=Lower('name'),
    cnt=Count('name_lower')
).filter('cnt__gt'=1)

但当然它没有用。

知道怎么做吗?

1 个答案:

答案 0 :(得分:4)

你可以尝试一下:

qs = Manufacturer.objects.annotate(lname=Lower('name')
     ).values('lname').annotate(cnt=Count(Lower('name'))
     ).values('lname', 'cnt').filter(cnt__gt=1).order_by('lname', 'cnt')

为什么要添加order_by ordering-or-order-by

sql查询如下所示:

SELECT 
    LOWER("products_manufacturer"."name") AS "lname",
    COUNT(LOWER("products_manufacturer"."name")) AS "cnt"
FROM "products_manufacturer"
GROUP BY LOWER("products_manufacturer"."name")
HAVING COUNT(LOWER("products_manufacturer"."name")) > 1
ORDER BY "lname" ASC, "cnt" ASC