Не удается отправить элемент в базу данных, Django
У меня есть модель под названием CurrentBestSellersListItem, с целым полем, некоторыми CharFields и URLField. У меня также есть сериализатор для данной модели. Я могу создавать экземпляры CurrentBestSellersListItem в базе данных вручную из http://127.0.0.1:8000/admin/lists/currentbestsellerslistitem/add/, т.е. из панели администратора, но не могу создать их по другому маршруту. Другой маршрут, который у меня есть (в urls.py) это:
path('list-items-create/', views.create_saved_list_item, name='create_saved_list_item'),
а функция create_saved_list_item в файле views.py имеет вид:
@api_view(['POST'])
def create_saved_list_item(request):
json_object = json.dumps(request.data, indent = 1)
serializer = CurrentBestSellersListItemSerializer(data=json_object)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
Если я перейду по адресу http://127.0.0.1:8000/api/list-items-create/ и размещу следующие данные:
{
"rank": 555,
"weeks_on_list": 555,
"publisher": "a",
"description": "b",
"title": "c",
"author": "d",
"amazon_product_url": "amazon.com/books/5"
}
тогда я получаю такой ответ:
HTTP 200 OK
Allow: OPTIONS, POST
Content-Type: application/json
Vary: Accept
{}
и элемент НЕ добавляется в подключенную базу данных, как ожидалось. Может ли кто-нибудь из вас определить, где ошибка?
В вашем коде есть несколько проблем.
Прежде всего, вы не должны использовать json.dumps()
, так как сериализатор принимает не строку, а дикт для создания вашей модели.
В зависимости от того, как структурирован ваш запрос, вы можете напрямую передать тело запроса или JSON запроса в сериализатор.
json_object = json.parse(request.data)
serializer = CurrentBestSellersListItemSerializer(data=json_object)
Второе - вы не возвращаете никакого сообщения или информации в случае, если данные не действительны.
if serializer.is_valid():
serializer.save()
Просто добавьте регистрацию ошибок, чтобы выяснить, что не так с данными, которые вы отправляете.
if serializer.is_valid():
serializer.save()
else:
return JSONResponse({'errors': serializer.errors, 'input_data': json_object, 'validated_data': serializer.validated_data})
Если вам не нравится возвращать JSONResponse
с деталями ошибки, вы можете просто добавить raise_exception=True
к вашей валидации.
if serializer.is_valid(raise_exception=True):
serializer.save()