Skip to content

4. Example - JSON Response

In Django, to get a database object and send it as JSON, you can use Django’s JsonResponse to return data in JSON format. Here’s how you can do it step by step:

Step 1: Get the Database Object

You can use Django’s ORM (Object-Relational Mapping) to retrieve objects from the database. In this example, I’ll assume you’re working with a Book model.

Step 2: Create a View that Returns JSON

You can create a view that queries the database for an object (or a set of objects) and returns the data as JSON.

Example:

Assume you have a Book model like this:

models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
description = models.TextField()
published_date = models.DateField()
def __str__(self):
return self.title

Step 3: Create the View

In your views.py, you can use Django’s JsonResponse to return the object as a JSON response.

views.py
from django.http import JsonResponse
from django.shortcuts import get_object_or_404
from .models import Book
def book_detail_json(request, id):
# Get the book object from the database, or return 404 if not found
book = get_object_or_404(Book, pk=id)
# Create a dictionary with the data you want to return as JSON
book_data = {
'id': book.id,
'title': book.title,
'author': book.author,
'description': book.description,
'published_date': book.published_date,
}
# Return the data as a JsonResponse
return JsonResponse(book_data)

Step 4: Define the URL Pattern

In your urls.py, define a URL pattern to call this view:

urls.py
from django.urls import path
from . import views
urlpatterns = [
path('books/<int:id>/json/', views.book_detail_json, name='book_detail_json'),
]

This will map the URL /books/1/json/ (for example) to the book_detail_json view.

Step 5: Access the JSON Response

Now, if you visit:

/books/1/json/

You will get a JSON response that looks like this:

{
"id": 1,
"title": "The Great Gatsby",
"author": "F. Scott Fitzgerald",
"description": "A novel about the American dream.",
"published_date": "1925-04-10"
}

Step 6: Optional - Return a List of Objects

If you want to return a list of objects (for example, all books), you can serialize multiple instances.

views.py
from django.http import JsonResponse
from .models import Book
def books_list_json(request):
books = Book.objects.all() # Get all books from the database
books_data = list(books.values('id', 'title', 'author', 'description', 'published_date'))
return JsonResponse(books_data, safe=False)

In this example, books.values() returns a list of dictionaries containing the fields specified (id, title, author, etc.). The safe=False argument is needed because we’re returning a list of dictionaries, and by default, JsonResponse expects the data to be a dictionary.

The URL pattern for this might look like:

urls.py
urlpatterns = [
path('books/json/', views.books_list_json, name='books_list_json'),
]

Final Notes:

  1. JsonResponse automatically converts Python dictionaries to JSON. It also sets the correct Content-Type header (application/json).
  2. get_object_or_404 is a helpful Django shortcut for retrieving an object by its primary key (or any other field) or returning a 404 response if not found.
  3. Returning lists: When returning a list (e.g., books_data), set safe=False in JsonResponse, as the default behavior is to allow only dictionaries.