【发布时间】:2019-04-27 02:42:15
【问题描述】:
我无法访问由 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.log(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);
});
}
我发送作为音频文件的 blob 数据,以便在后端处理语音。后端处理音频文件并正确过滤对象。然后它使用 JSON 格式的查询集响应客户端。我有兴趣获取对象 PK 并在图库网格中显示图像。
这是我的
Views.py:
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]}
}
]
我尝试过类似的方法:
- obj.data[0].pk
- obj.data[0][pk]
- obj.data[0].['pk']
- obj.data.pk[0]
等等,但我总是不确定。
提前致谢
【问题讨论】:
-
那是真的 JSON吗?有不一致的地方
-
好吧,我根据 Django Docs 关于如何序列化对象生成它,因此 JSON 由 Django 生成。为什么是错的?我是 JSON 新手。
-
我并不是说这是错误的,我是说您将 JSON 数据的根显示为一个数组 (
[),但您以obj.data访问已解析的 JSON。那么 complete JSON 字符串是什么样的呢?所以在注释掉的控制台日志中,如果你console.log()只有obj,你会得到什么? -
试试
obj.data[0]['pk']没有点。也许obj.data[0][0]['pk'] -
哦,它不是 json 是一个 python 字典列表。
标签: javascript arrays json ajax django