假设我们在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 name和count。但是,你可以QuerySet通过将其反馈给另一个查询来使用它来构造一个常规:
ValuesQuerySet
name
count
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])