我正在尝试使用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
最不常见的列表进行排序。
我知道我可以使用values
和annotate
来创建name
值的排序列表,如下所示:
Person.values('name').annotate(Count('id')).order_by('id__count')
但是我不希望有name
的列表;我想要一个Person
对象的列表。有没有办法做到这一点?
答案 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”(如果要降序排序)。