IndexError: индекс кортежа вышел за пределы диапазона - Django

При попытке выполнить консультацию с БД (Heroku postgres) я получаю IndexError: tuple index out of range:

views.py:

def get_total_per_month(request, year):
    user= User.objects.values("id").filter(username=request.user)    
    query = (        
        f"SELECT to_char(date_trunc('month', \"move_date\"), 'MM') AS month_number,"
        f" sum( CASE WHEN \"move_id\" = 1 THEN \"move_value\" WHEN \"move_id\" = 2 THEN -\"move_value\" END ) as total"
        f" FROM move_control WHERE \"user_id\" = {user[0]['id']}"
        f" AND \"move_date\"::text LIKE '{year}%' GROUP BY month_number"
    )
 
    # Retrieve data
    for p in Move.objects.raw(query):
        print(p)

При попытке получить данные de появляется следующая ошибка:

File "C:\Users\LonxfUser\AppData\Local\Programs\Python\Python38\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params) IndexError: tuple index out of range

Я попробовал выполнить этот запрос непосредственно из базы данных, и он работает, так что, возможно, я что-то упускаю. Я просмотрел документацию по Django, но то, что я пробовал, не сработало.

user[0]['id'] - единственное появление индексации кортежа в этом коде. Таким образом, user должен быть пустым кортежем, что означает, что ваше выражение фильтра не совпало ни с одним пользователем.

Я предполагаю, но мне кажется, что выражение фильтра соответствует неправильному атрибуту. request.user - это весь объект user, который не будет соответствовать имени пользователя. Попробуйте вместо этого использовать request.user.username.

Кроме того, почему вы используете .values("id") в выражении фильтра? Это ограничивает запрос, чтобы вернуть только атрибут id, поэтому поиск по имени пользователя будет невозможен.

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