How to pass model fields to a JsonResponse object

To pass nondictionary values to the JsonResponse as you retrieved with Genres.object.values('name','color') you can simple set the safe argument to false and it will return JSON.

from django.http import JsonResponse

def django_json(request):
    data = Genres.object.values('name','color')
    return JsonResponse(data, safe=False)

That should return a list of JSON of the values you specified. Check out my article How to Return a Json Response with Django for more detailed info on how this works.

Alternatively, if you would like to return a queryset back as JSON you can use Djangos core serializer like this:

from django.core.serializers import serialize
from django.http import JsonResponse
from .models import Genre

def django_models_json(request):
    qs = Genre.objects.all()
    data = serialize("json", qs, fields=('name', 'color'))
    return JsonResponse(data)

This will return the same as above.


For future reference, .values() returns a ValuesQuerySet that behaves like a iterable full of dictionaries, so using the list() will make a new instance of a list with all the dictionaries in it. With that, you can create a new dict and serialize that.

response = JsonResponse(dict(genres=list(Genre.objects.values('name', 'color'))))

IIRC, it's not safe to have a JSON object that has a list as root and that's probably why Django is complaining. I couldn't find any reference about that now to provide a source, sorry.