Django查询:按值的出现次数对对象排序?

时间:2019-05-15 23:44:22

标签: django

我正在尝试使用Django返回具有重复值的对象列表,其值从重复最多的对象到重复最少的对象。

例如,假设我有以下模型:

class Person(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=128)

我想返回Person的列表,从name最常见的列表到name最不常见的列表进行排序。

我知道我可以使用valuesannotate来创建name值的排序列表,如下所示:

Person.values('name').annotate(Count('id')).order_by('id__count')

但是我不希望有name的列表;我想要一个Person对象的列表。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

使用Subquery

with_this_name = Person.objects.filter(name=OuterRef('name')).values('id')

persons = Person.objects.annotate(
     with_the_same_name=Count(Subquery(with_this_name))
).order_by(
    '-with_the_same_same'
)

答案 1 :(得分:0)

如果您在Count字段中输入名称,则应该可以对其进行排序。

Person.values('name').annotate(duplicates=Count('id')).order_by('duplicates')

...或“ -duplicates”(如果要降序排序)。