web-dev-qa-db-fra.com

django serialize queryset.values ​​() dans json

J'ai un modèle qui a de nombreux champs, mais pour ce problème, je n'ai besoin que de 3 de ces champs. Lorsque j'essaie de sérialiser un .values set j'obtiens une exception:

L'objet 'dict' n'a pas d'attribut '_meta'

Voici mon code:

queryset = myModel.objects.filter(foo_icontains=bar).values('f1', 'f2', 'f3')
serialized_q = serializers.serialize('json', queryset, ensure_ascii=False)
24
bash-

Les sérialiseurs Django ne peuvent sérialiser que le jeu de requêtes, values() ne renvoie pas le jeu de requêtes plutôt que l'objet ValuesQuerySet. Donc, évitez d'utiliser values(). Spécifiez plutôt les champs que vous souhaitez utiliser dans values(), dans la méthode de sérialisation comme suit:

Regardez ceci SO question par exemple

objectQuerySet = ConventionCard.objects.filter(ownerUser = user)
data = serializers.serialize('json', list(objectQuerySet), fields=('fileName','id'))

Au lieu d'utiliser objectQuerySet.values('fileName','id'), spécifiez ces champs en utilisant le paramètre fields de serializers.serialize() comme indiqué ci-dessus.

24
Davor Lucic

Comme d'autres l'ont dit, Django's serializers ne peut pas gérer un ValuesQuerySet. Cependant, vous pouvez sérialiser en utilisant une json.dumps() standard et en transformant votre ValuesQuerySet en une liste en utilisant list(). Si votre ensemble comprend Django champs tels que Decimals, vous devrez passer DjangoJSONEncoder . Ainsi:

import json
from Django.core.serializers.json import DjangoJSONEncoder

queryset = myModel.objects.filter(foo_icontains=bar).values('f1', 'f2', 'f3')
serialized_q = json.dumps(list(queryset), cls=DjangoJSONEncoder)
29
Andre Gregori

Faire une liste à partir de objectQuerySet:

data_ready_for_json = list( ConventionCard.objects.filter(ownerUser = user).values('fileName','id') )
12
Max

Il suffit de lancer pour dicter chaque élément et créer json avec json.dumps:

json.dumps([dict(item) for item in SomeModel.objects.all().values('id', 'title')])
2
Pavel Patrin