0
votes

Django View: Return QuerySet au format JSON

J'essaie de faire la vue suivante avec retour jsonResponse () code> à la fin du travail correctement: xxx pré>

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 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)


1 commentaires

JSONRESPONNONSE (Liste (Données)) É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 . Cela fonctionne parce que vous utilisez valeurs et annotate , la liste est donc une liste de dictionnaires contenant des champs sérialisables.


3 Réponses :


0
votes

jsonresponse (liste (données)) é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 .

Ceci fonctionne parce que vous utilisez des valeurs et Annotate , la liste est donc une liste de dictionnaires contenant des champs sérialisables.

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 liste () n'est pas suffisant. Si vous n'aviez pas ajouté , vous auriez eu une liste des instances fonds qui ne sont pas sérialisables.


0 commentaires

3
votes

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)


0 commentaires

0
votes

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)


0 commentaires