Почему выдает ошибку при попытке создать массив с обращением на БД в 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