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)
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.
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)
Faire une liste à partir de objectQuerySet:
data_ready_for_json = list( ConventionCard.objects.filter(ownerUser = user).values('fileName','id') )
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')])