Django:通过计算多对多对象来对查询集进行排序

时间:2016-06-15 16:21:39

标签: django count many-to-many django-queryset

我到处搜索但是我找不到这个问题的解决方案,初看起来应该是微不足道的。

请考虑Djano模型:

class UserModel(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    institution=models.CharField(max_length=128)


class TeamModel(models.Model):
    creator= models.ForeignKey(UserModel,related_name='creator')
    members= models.ManyToManyField(UserModel,related_name='teams'))
    name=models.CharField(max_length=64)`

那些模型是固定的,我无法改变它们。我当然可以包括新的领域。

要检索与用户关联的团队,我可以这样做:

queryset= instance_UserModel.teams.all()

完美无缺!现在我想按成员数量订购团队。

queryset= queryset.annotate(num_members=Count('members')).order_by('num_members')

它不起作用,因为num_members值总是" 1"!

print queryset[0].num_members
print queryset[1].num_members

始终返回" 1"。发生了什么??? !!!

提前谢谢你,

CBAR

2 个答案:

答案 0 :(得分:0)

未经测试

class TeamModel(models.Model):
    creator= models.ForeignKey(UserModel,related_name='creator')
    members= models.ManyToManyField(UserModel,related_name='teams'))
    name=models.CharField(max_length=64)`

views.py

import operator

teams = TeamModel.objects.all()
team_member_count = {}
for team in teams:
   team_member_count[team.name] = team.members.all.count()

sorted_teams_by_member_count = sorted(team_member_count.items(), key=operator.itemgetter(1))

答案 1 :(得分:0)

我找到了解决方案,但我不知道数据库操作的效率如何。我仍然不明白为什么我以前的代码不起作用。

    qUserTeams=instance_UserModel.teams.all()
    qAllTeams=TeamModel.objects.all().annotate(num_members=Count('members')).order_by('num_members')
    queryset= qAllTeams & qUserTeams