Я не могу получить доступ к первичному ключу объекта, сериализованного Django в JSON. Мой JavaScript выглядит так:
function makeLink() {
recorder && recorder.exportWAV(function (blob) {
let fd = new FormData;
fd.append("audio", blob);
let csrftoken = getCookie('csrftoken');
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var obj = JSON.parse(this.responseText);
/*console.info(obj[0].pk);*/
document.getElementById("result").innerHTML = obj.data[0]['pk'];
}
}
xhr.open('POST', uploadAudio_url , true)
//alert(uploadAudio_url)
xhr.setRequestHeader("X-CSRFToken", csrftoken);
xhr.onload = function () {
// __log("Audio Uploaded to server succesfully");
};
xhr.onerror = function (e) {
// __log("Error Uploading audio" + e)
};
xhr.send(fd);
});
}Я отправляю данные большого двоичного объекта, представляющие собой аудиофайл, для обработки речи в бэкэнде. Бэкэнд обрабатывает аудиофайл и правильно фильтрует объекты. Затем он отвечает клиенту с помощью набора запросов в JSON. Мне интересно получить объекты PK и показать изображения в сетке галереи.
Это мой
def process_speech(recognized_audio):
speech = recognized_audio
url = '' # Is the URL where the user will be redirected once speech is proccessed
keylist = []
for key in Keyword.objects.all():
if (speech.find(key.keyword.lower()) != -1):
keylist.append(key.keyword)
print('Identificado Keyword: ', keylist)
if (speech.find('fotos') != -1 or speech.find('fotografías') != -1):
print("Reconocido FOTO")
imagenes_filtered = Imagen.objects.filter(keyword__keyword__in=keylist)
#print(imagenes_filtered)
return imagenes_filtered
if (speech.find('video') != -1):
print("Reconocido VIDEO")
def upload(request):
print("Método: ", request.method)
print("Ajax: ", request.is_ajax())
if request.method == 'POST':
if request.FILES.get('audio'):
record_audio = request.FILES['audio']
fs = FileSystemStorage()
filename = fs.save(record_audio.name + ".wav", record_audio)
uploaded_file_url = fs.url(filename)
print("File received succesfully")
speech = decodeSpeech(filename)
print(speech)
objects = process_speech(speech)
data = serializers.serialize('json', objects)
return HttpResponse(JsonResponse({'data': data}, safe=False),)
else:
return render_to_response('index.html', {"errors":"No recognized audio"})
else:
return HttpResponseRedirect('/home/')
Я получаю следующие данные Json:
[
{
"model": "Galeria.imagen",
"pk": 20,
"fields":
{"image_width": 6000,
"image_height": 4000,
"fichero_imagen": "files/img/lucas-albuquerque-615558-unsplash.jpg",
"keyword": [17, 18]}
},
{
"model": "Galeria.imagen",
"pk": 21,
"fields":
{"image_width": 5855,
"image_height": 3860,
"fichero_imagen": "files/img/freestocks-org-794156-unsplash.jpg",
"keyword": [18]}
}
]
Я пробовал такие вещи, как:
и так далее, но я всегда получаю неопределенное значение.
заранее спасибо
Ну, я генерирую его в соответствии с Django Docs о том, как сериализовать объекты, чтобы JSON генерировался Django. Почему это неправильно? Я новичок в JSON.
Я не говорю, что это неправильно, я говорю, что вы показываете корень ваших данных JSON в виде массива ([), но вы получаете доступ к проанализированному JSON как obj.data. Так как же выглядит строка JSON полный? Итак, в закомментированном журнале консоли, что вы получите, если вы используете console.info() только obj?
попробуйте obj.data[0]['pk'] без точки. Может obj.data[0][0]['pk']
Да, и это не json, это список словарей на питоне.
@RedCricket. obj.data [0] [0 ['pk']] возвращает значение undefined.
@RandyCasburn. console.info (obj) показывает {данные: "[{" модель ":" Galeria.imagen "," pk ": 20," fields ": {… ocks-org-794156-unsplash.jpg", "ключевое слово": [1 ...
obj.data[0]['pk'] пробовали?
в случае успеха вы сможете получить ответ в том же формате, что и в вопросе?
Почему вы вставляете свой JSONResponse(который уже является подклассом класса HttpResponse) в HttpResponse?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема в том, что вы дважды сериализуете свои данные в JSON. Один раз с data = serializers.serialize('json', objects) и еще раз с JsonResponse({'data': data}). Создание JsonResponse позволяет избежать JSON из первого вызова, превращая список в большую строку.
Вам нужно будет удалить вложенный JsonResponse и напрямую передать JSON.
objects = process_speech(speech)
data = serializers.serialize('json', objects)
return HttpResponse(data) # Pass the JSON direct to the HttpResponse
Затем вам нужно будет изменить свой Javascript, чтобы он ожидал, что объект верхнего уровня будет списком (без свойства data):
document.getElementById("result").innerHTML = obj[0]['pk'];
Это В самом деле JSON? Есть несоответствия