Почему выдает ошибку при попытке создать массив с обращением на БД в django

Пытаюсь создать массив с именами игроков чтобы вернуть клиенту. Попробовал сделать это так:

players = [exec(f'players_info.player_{x+1}') for x in range(players_info.joined_players_quantities)]

Но выдает ошибку:

name 'players_info' is not defined

Потом решил вывести это все в отделную функцию чтобы возвращала имя игрока и все заработало:

def return_player_name(x, name):
    players = Joined_players.objects.get(room_name= name)
    return exec(f'players.player_{x + 1}')

Код views:

def join_room(request):
    json_data = json.loads(request.body)
    if Game_rooms.objects.filter(room_name = json_data['name']).exists() and json_data['password'] == Game_rooms.objects.get(room_name = json_data['name']).room_password:
        players_info = Joined_players.objects.get(room_name=json_data['name'])
        if players_info.joined_players_quantities < Game_rooms.objects.get(room_name = json_data['name']).room_settings_player_quantities:
            players_info.joined_players_quantities += 1
            #players = [exec(f'players_info.player_{x+1}') for x in range(players_info.joined_players_quantities)]

            exec(f"players_info.player_{players_info.joined_players_quantities} = json_data['incoming_login']")
            return JsonResponse({'success': True,
                                 'info': 'all good',
                                 'players': [return_player_name(x+1,json_data['name']) for x in range(players_info.joined_players_quantities)]})
        else:
            return JsonResponse({'success': False, 'info': 'Room is full'})
    else:
        return JsonResponse({'success': False, 'info': 'Incorrect name or password'})

Код models:

class Joined_players(models.Model):
    room_name = models.CharField(max_length=50)
    joined_players_quantities = models.IntegerField(default=0, null=True)
    player_1 = models.CharField(max_length=100, null=True)
    player_2 = models.CharField(max_length=100, null=True)
    player_3 = models.CharField(max_length=100, null=True)
    player_4 = models.CharField(max_length=100, null=True)
    player_5 = models.CharField(max_length=100, null=True)
    player_6 = models.CharField(max_length=100, null=True)
    player_7 = models.CharField(max_length=100, null=True)
    player_8 = models.CharField(max_length=100, null=True)
    player_9 = models.CharField(max_length=100, null=True)
    player_10 = models.CharField(max_length=100, null=True)
    player_11 = models.CharField(max_length=100, null=True)
    player_12 = models.CharField(max_length=100, null=True)

Ответы (1 шт):

Автор решения: Alecs Fly

Вся проблема в exec. Начиная именно с Python 3 она не меняет локальные переменные. Решил это так:

def return_player_name(x, name):
    players = Joined_players.objects.get(room_name=name)
    namespace = {'players': players}
    exec(f'player_name = players.player_{x}', namespace)
    return namespace['player_name']

Если хотите прочитать про изменения exec то вот ссылка: https://overcoder.net/q/139658/%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8-exec-%D0%B2-python-2-%D0%B8-python-3

→ Ссылка