How to serialize Django queryset.values() into json?

前端 未结 5 387
情话喂你
情话喂你 2020-12-13 13:31

I have a model that has many fields, however for this problem I only need 3 of those fields. When I try to serialize a .values set I get an exception:

相关标签:
5条回答
  • 2020-12-13 14:02

    As other people have said, Django's serializers can't handle a ValuesQuerySet. However, you can serialize by using a standard json.dumps() and transforming your ValuesQuerySet to a list by using list(). If your set includes Django fields such as Decimals, you will need to pass in DjangoJSONEncoder. Thus:

    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)
    
    0 讨论(0)
  • 2020-12-13 14:07

    Make list from objectQuerySet:

    data_ready_for_json = list( ConventionCard.objects.filter(ownerUser = user).values('fileName','id') )
    
    0 讨论(0)
  • 2020-12-13 14:08

    Just cast to dict every item and create json with json.dumps:

    json.dumps([dict(item) for item in SomeModel.objects.all().values('id', 'title')])
    
    0 讨论(0)
  • 2020-12-13 14:17

    Django serializers can only serialize queryset, values() does not return queryset rather ValuesQuerySet object. So, avoid using values(). Rather, specifiy the fields you wish to use in values(), in the serialize method as follows:

    Look at this SO question for example

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

    Instead of using objectQuerySet.values('fileName','id'), specify those fields using the fields parameter of serializers.serialize() as shown above.

    0 讨论(0)
  • 2020-12-13 14:22

    My solution, It's work fine

    from django.core.serializers import serialize
    import json
    
    permission_list = Permission.objects.all().order_by('-id')
    permission_serialize= json.loads(serialize('json', permission_list))
    return JsonResponse({'data': permission_serialize})
    
    0 讨论(0)
提交回复
热议问题