Всегда получайте None из запроса Django api в качестве результата
Я собираюсь получить whitebg_url результат из базы данных sqlite в соответствии с совпадающими элементами и сделал api запрос используя django следующим образом.
@api_view(['POST'])
def getUrlFromAttributes(request):
try:
print('>>>>>>>>>>>>>>>>>>>>>', request)
hairstyle = request.data.get("hairstyle")
haircolor = request.data.get("haircolor")
skincolor = request.data.get("skincolor")
print("error>>1", str(hairstyle), str(haircolor), str(skincolor))
basic_query = BasicSetup.objects.all().filter(skin_color=skincolor, hair_color=haircolor, hair_style=hairstyle, isDeleted= 0)
print('returned basic queyr : ', basic_query)
lists_basicSetup = list(basic_query.values( 'whitebg_url'))
print('returned lists_basicSetup : ', lists_basicSetup)
return JsonResponse({'result': lists_basicSetup})
except Exception as error:
print("error", str(error))
return JsonResponse({'result': str(error)})
Но как вы можете видеть результат на изображении ниже, ответ всегда None. Я пытался найти решение в google, но не смог этого сделать.
Я уже добавил rest_framework в INSTALLED_APPS в settings.py файл.
и путь подобен определенному.
path('getUrlFromAttributes', views.getUrlFromAttributes, name='getUrlFromAttributes'),
Я пытался сделать это с помощью Postman, но результат тот же.
Кто-нибудь знает, почему я получаю None в результате?
Параметры GET не сохранены в request.data. Проверьте request.GET. См. документацию
Вы можете получить тело запроса в виде байтов и разобрать его с помощью JSONParser.
.
Я только что отредактировал ваш код следующим образом:
import io
from rest_framework.parsers import JSONParser
# Create your views here.
@api_view(['POST'])
def getView(request, *args, **kwargs):
try:
# you can get byte data from request body
print('>>>>>>>>>>>>>>>>>>>>>', request.body)
# get bytes and parse using json
# do these before
byte_body = io.BytesIO(request.body)
parsed_body = JSONParser().parse(byte_body)
hairstyle = parsed_body.get("hairstyle")
haircolor = parsed_body.get("haircolor")
skincolor = parsed_body.get("skincolor")
print("error>>1", str(hairstyle), str(haircolor), str(skincolor))
basic_query = BasicSetup.objects.all().filter(skin_color=skincolor, hair_color=haircolor, hair_style=hairstyle, isDeleted= 0)
print('returned basic query : ', basic_query)
lists_basicSetup = list(basic_query.values( 'whitebg_url'))
print('returned lists_basicSetup : ', lists_basicSetup)
return JsonResponse({'result': lists_basicSetup})
except Exception as error:
print("error", str(error))
return JsonResponse({'result': str(error)})
Просто как друг, если можете, используйте представления и сериализаторы на основе классов.
Посмотрите на (ваше) изображение выше. Вы заметили в url параметры Hairstyle, haircolor skincolor, etc?
Это происходит при GET-запросе. Да, журнал показывает POST, что означает, что событие POST действительно произошло.
Есть вероятность, что ваши данные на самом деле не POSTed, поэтому вы не получаете их в функции представления.
Предложения:
- Проверьте ваш JS файл, отвечающий за POSTing (вы можете поделиться здесь, если хотите).
- Попробуйте взять параметры из url (метод GET, если информация не чувствительна), если ваш POSTing не работает, просто чтобы проверить мою теорию.
request.query_params
- Прочитайте еще раз Django RestFrameworks oc

