У меня проблема с 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
, я получаю результат, который хочу