TypeError: объект 'int' не является итерируемым при передаче аргументов в функцию

У меня есть функция, которая выполняет некоторые вычисления на основе отфильтрованного набора запросов. Я хочу передать аргументы в функцию для информирования фильтра. Основы:

Представление для проверки вывода:

def TestPlayerData(request):
    data = PlayerData(1,2)
    print(data)
    return HttpResponse(data)

Вызванная функция:

def PlayerData(game, player):
    """This is a function based on EventFilterView"""
    opponent = [2]
    qs = Event.objects.filter(g_players=player).filter(g_name__in=game).filter(g_players__in=opponent)
    count_wins = len(qs.filter(g_winner=player))
    count_played = len(qs.filter(g_players=player))
    
    if count_played == 0:
        win_ratio = 'na'
    else:
        win_ratio = count_wins/count_played

    return count_wins, count_played, win_ratio

Получена ошибка: "TypeError: 'int' object is not iterable"

Однако, если я явно называю переменные в функции, а не передаю их из представления, функция работает так, как ожидалось - примерно так:

def PlayerData():
    """This is a function based on EventFilterView"""
    game = [1]
    player =2    
    opponent = [2]
    qs = Event.objects.filter(g_players=player).filter(g_name__in=game).filter(g_players__in=opponent)
    count_wins = len(qs.filter(g_winner=player))
    count_played = len(qs.filter(g_players=player))

    if count_played == 0:
        win_ratio = 'na'
    else:
        win_ratio = count_wins/count_played

    return count_wins, count_played, win_ratio

Я явно не понимаю основ python и был бы признателен за подсказку в правильном направлении.

В первом блоке кода вы передаете data = PlayerData(1,2)

PlayerData() однако в конечном итоге использует .filter() на параметрах, что невозможно сделать на int, что вызовет ошибку TypeError.

В вашем последнем примере, где вы вписываете свои собственные # после факта, вы передаете game как список, где в первом блоке кода game было int. Вы передаете его правильно, когда делаете это вручную.

Вернуться на верх