Django ORM计数相关字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django ORM计数相关字段相关的知识,希望对你有一定的参考价值。

我有以下型号:

class Profile(models.Model):
    pass

class Team(models.Model):
    ...
    members = models.ManyToManyField("main.Profile", through='main.TeamMember')

class TeamMember(models.Model):
    profile = models.ForeignKey('Profile')
    team = models.ForeignKey('Team')
    role = models.CharField(max_length=255)

所以,我尝试通过具有特定角色的配置文件的数量来订购团队,并且我有一个查询,这不起作用:

Team.objects.filter(members__role='ExampleRole').annotate(example_role_count=Count('members')).order_by('example_role_count')

它引发了以下异常:

django.core.exceptions.FieldError: Related Field got invalid lookup: role

因为role是TeamMember字段,而不是Profile。那么,如何通过具有指定角色的成员数量来实现排序?

答案

最后,找到了一个解决方案(仅适用于Django> = 1.11)

queryset = Team.objects.annotate(example_role_count=Subquery(TeamMember.objects.filter(role='example_role', team=OuterRef('pk')).values('team').annotate(cnt=Count('pk')).values('cnt'), output_field=IntegerField())).order_by('-example_role_count')
另一答案

如果要通过“通过”模型字段过滤查询集,然后想要根据相关字段计数对结果集进行排序,

from django.db.models import Count

# descending order
Team.objects.filter(teammember__role='ExampleRole').annotate(example_role_count=Count('members')).order_by('-example_role_count')

以上是关于Django ORM计数相关字段的主要内容,如果未能解决你的问题,请参考以下文章

Django之模型层(ORM相关知识)

Django 查询相关字段计数

Django之ORM

Django之ORM

Django之ORM操作

Django---ORM操作大全