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
najmath 12 avril 2018 à 14:36

3 réponses

Meilleure réponse

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)
    ...
2
Will Keeling 12 avril 2018 à 12:58

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

0
Kenstars 12 avril 2018 à 11:40

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.

0
Ivo Merchiers 26 juin 2019 à 08:00