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
, поэтому поиск по имени пользователя будет невозможен.