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解决方案?

回答:

尝试:

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])

以上是 Django仅选择具有重复字段值的行 的全部内容, 来源链接: utcz.com/qa/426659.html

回到顶部