Day 4 of 5
⏱ ~60 minutes
Django in 5 Days — Day 4

REST API with Django REST Framework

Add an API layer to your Django app. Serializers convert models to JSON, ViewSets provide CRUD endpoints, and TokenAuth secures them.

Installing DRF

Terminal
pip install djangorestframework
# Add to INSTALLED_APPS: 'rest_framework'
blog/serializers.py
from rest_framework import serializers
from .models import Post

class PostSerializer(serializers.ModelSerializer):
    author_name = serializers.CharField(source='author.username', read_only=True)

    class Meta:
        model = Post
        fields = ['id', 'title', 'slug', 'body', 'author_name', 'created_at', 'published']
        read_only_fields = ['slug', 'created_at']
blog/views.py — ViewSet
from rest_framework import viewsets, permissions
from .models import Post
from .serializers import PostSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.filter(published=True)
    serializer_class = PostSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)
blog/urls.py — Router
from rest_framework.routers import DefaultRouter
from . import views

router = DefaultRouter()
router.register('posts', views.PostViewSet)

urlpatterns = router.urls
# Registers: GET /posts/, POST /posts/, GET /posts/{id}/, PUT, PATCH, DELETE
Token Authentication
# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ]
}

INSTALLED_APPS += ['rest_framework.authtoken']
# python manage.py migrate
# POST /api-token-auth/ with username/password → returns token
# Client sends: Authorization: Token 
📝 Day 4 Exercise
Build a REST API for Your Blog
  1. A
  2. d
  3. d
  4. D
  5. R
  6. F
  7. .
  8. C
  9. r
  10. e
  11. a
  12. t
  13. e
  14. a
  15. P
  16. o
  17. s
  18. t
  19. S
  20. e
  21. r
  22. i
  23. a
  24. l
  25. i
  26. z
  27. e
  28. r
  29. w
  30. i
  31. t
  32. h
  33. a
  34. l
  35. l
  36. f
  37. i
  38. e
  39. l
  40. d
  41. s
  42. .
  43. R
  44. e
  45. g
  46. i
  47. s
  48. t
  49. e
  50. r
  51. a
  52. P
  53. o
  54. s
  55. t
  56. V
  57. i
  58. e
  59. w
  60. S
  61. e
  62. t
  63. w
  64. i
  65. t
  66. h
  67. t
  68. h
  69. e
  70. r
  71. o
  72. u
  73. t
  74. e
  75. r
  76. .
  77. T
  78. e
  79. s
  80. t
  81. a
  82. l
  83. l
  84. e
  85. n
  86. d
  87. p
  88. o
  89. i
  90. n
  91. t
  92. s
  93. w
  94. i
  95. t
  96. h
  97. c
  98. u
  99. r
  100. l
  101. o
  102. r
  103. P
  104. o
  105. s
  106. t
  107. m
  108. a
  109. n
  110. .
  111. A
  112. d
  113. d
  114. t
  115. o
  116. k
  117. e
  118. n
  119. a
  120. u
  121. t
  122. h
  123. a
  124. n
  125. d
  126. v
  127. e
  128. r
  129. i
  130. f
  131. y
  132. u
  133. n
  134. a
  135. u
  136. t
  137. h
  138. e
  139. n
  140. t
  141. i
  142. c
  143. a
  144. t
  145. e
  146. d
  147. u
  148. s
  149. e
  150. r
  151. s
  152. c
  153. a
  154. n
  155. '
  156. t
  157. P
  158. O
  159. S
  160. T
  161. .

Day 4 Summary

  • Serializers convert model instances to JSON (and back). ModelSerializer auto-generates fields from the model.
  • ModelViewSet provides all 5 CRUD endpoints (list, create, retrieve, update, destroy) with minimal code.
  • Routers auto-register URL patterns for ViewSets. One line replaces five URL patterns.
  • IsAuthenticatedOrReadOnly = public reads, auth required for writes. The right default for most APIs.
Finished this lesson?