Ошибка "индексы строк должны быть целыми числами" при запросе

Я только учусь писать программы и приложения на 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
Вернуться на верх