J'essaie de faire la vue suivante avec Cependant, je reçois un message d'erreur disant "objet de type requérant n'est pas sérialisable JSON ".
Lorsque je mettez la requête ci-dessus dans une vue avec retour jsonResponse () code> à la fin du travail correctement:
Render Render () Code> à la fin: P>
def get_more_data(request):
full_data = Fund.objects.all()
data = {"test2": full_data.values('investment_strategy').annotate(sum=Sum('commitment'))}
return render (request, 'test.html', data)
3 Réponses :
Ceci fonctionne parce que vous utilisez des valeurs Dans l'exemple que vous avez mentionné, il n'a pas fonctionné car le requérant ne faisait que renvoyer une liste d'instances de modèle, donc envelopper dans jsonresponse (liste (données)) code> évaluera la requête (exécutera réellement la requête à la base de données) et allumez-la dans une liste pouvant être transmise à
JSONResponse code>. p>
code> et
Annotate code>, la liste est donc une liste de dictionnaires contenant des champs sérialisables. P>
liste () code> n'est pas suffisant. Si vous n'aviez pas ajouté code> code>, vous auriez eu une liste des instances code> fonds code> qui ne sont pas sérialisables. P>
J'ai donc réussi à trouver une solution, qui a fonctionné pour moi - au cas où quelqu'un d'autre a le même problème. J'ai changé de vue sur les éléments suivants:
def get_data(request): full_data = Fund.objects.all() full_data_filtered = full_data.values('investment_strategy').annotate(sum=Sum('commitment')) labels = [] values = [] for d in full_data_filtered: labels.append(d['investment_strategy']) values.append(d['sum']) data = { "labels": labels, "values": values, } return JsonResponse(data)
Le meilleur moyen que j'ai trouvé était de créer un querySet personnalisé et un gestionnaire, ce n'est pas beaucoup de code et il est réutilisable!
J'ai commencé par créer le QuerySet personnalisé : P>
# views.py def get_data(request): full_data = Fund.objects.all().dict() return JsonResponse(full_data)
JSONRESPONNONSE (Liste (Données)) CODE> Évaluer le querySet (exécutez-la en réalité la requête à la base de données) et allumez-la dans une liste pouvant être transmise à
JSONResponse code>. Cela fonctionne parce que vous utilisez
valeurs code> et
annotate code>, la liste est donc une liste de dictionnaires contenant des champs sérialisables.