一尘不染

Django仅选择具有重复字段值的行

django

假设我们在Django中有一个定义如下的模型:

class Literal:
    name = models.CharField(...)
    ...

名称字段不是唯一的,因此可以具有重复的值。我需要完成以下任务:从模型中选择具有至少一个name字段重复值的所有行。

我知道如何使用普通的SQL来做到这一点(可能不是最好的解决方案):

select * from literal where name IN (
    select name from literal group by name having count((name)) > 1
);

因此,可以使用django ORM选择它吗?还是更好的SQL解决方案?


阅读 710

收藏
2020-03-31

共1个答案

一尘不染

尝试:

from django.db.models import Count
Literal.objects.values('name')
               .annotate(Count('id')) 
               .order_by()
               .filter(id__count__gt=1)

这与使用Django所获得的效果非常接近。问题在于这将返回一个ValuesQuerySetwith namecount。但是,你可以QuerySet通过将其反馈给另一个查询来使用它来构造一个常规:

dupes = Literal.objects.values('name')
                       .annotate(Count('id'))
                       .order_by()
                       .filter(id__count__gt=1)
Literal.objects.filter(name__in=[item['name'] for item in dupes])
2020-03-31