Ошибка "индексы строк должны быть целыми числами" при запросе
Я только учусь писать программы и приложения на python. Я пишу сериализатор для приложения Recipe. Но я получаю ошибку. Пожалуйста, помогите мне понять и написать правильно.
Вот сериализатор:
но когда я делаю POST запрос к конечной точке http://127.0.0.1:8000/api/recipes/
тело запроса:
{
"author": 1,
"ingredients": [
{
"id": 1,
"name": "колбаса",
"measurement_unit": "гр",
"amount": 100
}
],
"tags": [1],
"image":,
"name": "манная супер каша",
"text": "каша",
"cooking_time": 10
}
Выдает ошибку:
Traceback (most recent call last):
File "D:\Dev\foodgram-project-react\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "D:\Dev\foodgram-project-react\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\Dev\foodgram-project-react\venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "D:\Dev\foodgram-project-react\venv\lib\site-packages\rest_framework\viewsets.py", line 114, in view
return self.dispatch(request, *args, **kwargs)
File "D:\Dev\foodgram-project-react\venv\lib\site-packages\rest_framework\views.py", line 505, in dispatch
response = self.handle_exception(exc)
File "D:\Dev\foodgram-project-react\venv\lib\site-packages\rest_framework\views.py", line 465, in handle_exception
self.raise_uncaught_exception(exc)
File "D:\Dev\foodgram-project-react\venv\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception
raise exc
File "D:\Dev\foodgram-project-react\venv\lib\site-packages\rest_framework\views.py", line 502, in dispatch
response = handler(request, *args, **kwargs)
File "D:\Dev\foodgram-project-react\venv\lib\site-packages\rest_framework\mixins.py", line 18, in create
serializer.is_valid(raise_exception=True)
File "D:\Dev\foodgram-project-react\venv\lib\site-packages\rest_framework\serializers.py", line 234, in is_valid
self._validated_data = self.run_validation(self.initial_data)
File "D:\Dev\foodgram-project-react\venv\lib\site-packages\rest_framework\serializers.py", line 433, in run_validation
value = self.to_internal_value(data)
File "D:\Dev\foodgram-project-react\venv\lib\site-packages\rest_framework\serializers.py", line 492, in to_internal_value
validated_value = validate_method(validated_value)
File "D:\Dev\foodgram-project-react\backend\recipes\serializers.py", line 112, in validate_ingredients
ingredients_ids = [ingredient['id'] for ingredient in ingredients]
File "D:\Dev\foodgram-project-react\backend\recipes\serializers.py", line 112, in <listcomp>
ingredients_ids = [ingredient['id'] for ingredient in ingredients]
TypeError: string indices must be integers
Это ошибка в методе validate_ingredients. Пожалуйста, подскажите, как сделать это правильно.
Ingredients - это массив, а не словарь. ingredients[0]['id'] имеет смысл, а ingredients['id'] - нет.
Вы можете сделать примерно следующее:
ingredients = data[0]
ingredients_ids = []
for ingredient in ingredients:
if not ingredient['id']:
raise ValidationError('Не выбрано ни одного ингредиента!')
else:
ingredients_ids.append(ingredient['id'])
это решение помогло:
def validate_ingredients(self, data):
ingredients = self.initial_data.get('ingredients')
if not ingredients:
raise ValidationError('Нужно выбрать минимум 1 ингридиент!')
for ingredient in ingredients:
if int(ingredient['amount']) <= 0:
raise ValidationError('Количество должно быть положительным!')
return data