Je dois sélectionner les symptômes qui se trouvent dans le dictionnaire avec les symptômes déjà publiés.Cela fonctionne bien.Mais pour certains symptômes, typeError s'affiche dans l'invite de commande et tous sont également imprimés dans l'invite de commande mais pas dans la page html. Voici mon code
Views.py
def predict(request):
sym=request.POST.getlist('symptoms[]')
sym=list(map(int,sym))
diseaseArray=[]
diseaseArray=np.array(diseaseArray,dtype=int)
dictArray=[]
for dicti in dictionary:
if (set(sym)<= set(dicti['symptoms']) and len(sym)!= 0) or [x for x in sym if x in dicti['primary']]:
diseaseArray=np.append(diseaseArray,dicti['primary'])
diseaseArray=np.append(diseaseArray,dicti['symptoms'])
diseaseArray=list(set(diseaseArray))
print(diseaseArray)
for i in diseaseArray:
if i not in sym:
dict={'id':i}
dictArray.append(dict)
print(dictArray)
for j in dictArray:
symptoms=Symptom.objects.get(syd=j['id'])
j['name']=symptoms.symptoms
print(j['name'])
print(len(dictArray))
return JsonResponse(dictArray,safe=False)
Modèle
$('.js-example-basic-multiple').change(function(){
$('#suggestion-list').html('');
$('#suggestion').removeClass('invisible');
$.ajax({
url:"/predict",
method:"post",
data:{
symptoms: $('.js-example-basic-multiple').val(),
},
success: function(data){
data.forEach(function(disease){
console.log(disease.name)
$('#suggestion-list').append('<li>'+disease.name+'<li>')
$('#suggestion-list').removeClass('invisible');
});
}
});
3 réponses
Le type de chaque élément dans diseaseArray
est un np.int32
tel que défini par la ligne:
diseaseArray=np.array(diseaseArray,dtype=int) # Elements are int32
int32
ne peut pas être sérialisé en JSON par le JsonResponse
renvoyé de la vue.
Pour résoudre ce problème, convertissez la valeur id en un int
normal:
def predict(request):
...
for i in diseaseArray:
if i not in sym:
dict={'id': int(i)} # Convert the id to a regular int
dictArray.append(dict)
print(dictArray)
...
Vous semblez essayer d'enregistrer des objets sérialisables non JSON. Si vous souhaitez enregistrer des objets spécifiques pour une utilisation ultérieure, je vous recommande d'utiliser des cornichons. https://docs.python.org/3/library/pickle.html
Au lieu de convertir manuellement les valeurs en pouces comme le suggère la réponse acceptée, vous pouvez généralement laisser numpy le faire pour vous.
Au lieu d'appeler
diseaseArray=list(set(diseaseArray))
Tu peux appeler
diseaseArray=diseaseArray.unique().tolist()
Cela devrait convertir automatiquement tous les types de données spécifiques à numpy dans le tableau aux types de données Python normaux. Dans ce cas, il convertira int32 en int, mais il prend également en charge d'autres conversions.
De plus, l'utilisation de numpys .unique()
peut donner une certaine accélération aux grands ensembles de données.
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.