Python Django аннотировать количество всегда 1 - PullRequest
1 голос
/ 10 октября 2019

У меня проблема с Django, я запускаю этот запрос django, но аннотация кажется неправильной.

def find_team_from_match_request(match_request: MatchRequest) -> Optional[Team]:
"""Find a team from a MatchRequest"""

sport: Sport = match_request.criteria.sport
rank_group: int = match_request.group.get_rank(sport)
max_users: int = sport.playerPerTeam - match_request.group.count_users()
interval: int = match_request.get_rank_interval()

team: Team = Team.objects.annotate(
    num_users=Count('groups__users'),
    num_groups=Count('groups'),
    rank=Round('groups__users__sportsStats__rank'),
    rank_sum=Sum('groups__users__sportsStats__rank'),
    rank_distance=Func(Abs('rank') - rank_group, function='ABS')
).filter(
    match_id__isnull=True,
    sport=sport,
    num_users__lte=max_users,
    rank__lte=(rank_group + interval), rank__gt=(rank_group - interval),
    rank_distance__lte=interval
).order_by(
    'rank_distance',
    'rank'
).first()

if team is not None:
    print('team from match request', team)
    print('max_users', max_users)
    print('num_users', team.num_users)
    print('num_groups', team.num_groups)
    print('rank', team.rank)
    print('rank_sum', team.rank_sum)
    print('rank_distance', team.rank_distance)
    print('num users all', team.count_users())

return team

Например, при запуске этой функции у меня есть эти outpout

max_users 4
num_users 1
num_groups 1
rank 1360
rank_sum 1360
rank_distance 240
num users all 3
team from match request Team object (1)

Итак, когда я использую функцию для подсчета пользователей в команде (count_users), я получаю num_users == 3, но число, найденное django, равно 1, я не понимаю, почему.

Ивот мои модели:

class Team(models.Model):
"""Team model"""

sport = models.ForeignKey(Sport, on_delete=models.DO_NOTHING,
                          related_name='teams')
groups = models.ManyToManyField(Group, related_name='teams')
match = models.ForeignKey(Match, on_delete=models.DO_NOTHING,
                          related_name='teams', null=True, blank=True)

def count_users(self) -> int:
    """Count the associated users of a team"""
    count_users = 0
    for group in self.groups.all():
        count_users += group.count_users()
    return count_users

def get_rank(self, sport: Sport) -> int:
    """Get the rank of a team"""
    ranks = []
    for group in self.groups.all():
        for user in group.users.all():
            sport_stats = user.sportsStats.filter(sport=sport).first()
            ranks.append(sport_stats.rank)

    return round(mean(ranks))


class Group(models.Model):
"""Group model"""

def get_users(self):
    """Get associated users of a group"""

    return self.users.all()

def get_teams(self):
    """Get associated teams of a group"""

    return self.teams.all()

def count_users(self) -> int:
    """Count the associated users of a group"""

    return self.users.all().count()

def get_rank(self, sport: Sport) -> int:
    """Get the rank of a group"""

    ranks = []
    for user in self.users.all():
        sport_stats = user.sportsStats.filter(sport=sport).first()
        ranks.append(sport_stats.rank)

    return round(mean(ranks))

class User(models.Model):
"""User model"""

username = models.CharField(max_length=200)
group = models.ForeignKey(Group, on_delete=models.DO_NOTHING,
                          related_name='users', blank=True, null=True)

Я что-то пропустил?

Редактировать: Когда я использую только аннотацию num_users, я получаю результат, который хочу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...