Kalau kamu sudah pernah membangun website dengan Django, kamu pasti tahu betapa lengkapnya framework ini untuk membuat aplikasi web. Tapi bagaimana kalau kamu ingin aplikasimu dipakai lewat API — misalnya oleh aplikasi mobile, frontend JavaScript seperti React, atau layanan pihak ketiga? Di sinilah Django REST Framework (DRF) berperan. DRF adalah library paling populer untuk membangun REST API di atas Django, dipakai oleh ribuan startup dan perusahaan. Di tutorial ini kita akan membangun API buku sederhana yang lengkap: model, serializer, viewset, router, sampai pagination, filtering, dan autentikasi.

Apa Itu Django REST Framework?

Sebelum lanjut, pastikan kamu paham konsep dasarnya dulu. Kalau masih bingung soal REST dan HTTP methods, baca dulu artikel Apa Itu REST API dan Bagaimana Cara Kerjanya?. Singkatnya, DRF memberi kita empat komponen utama: serializer (mengubah objek model jadi JSON dan sebaliknya), views/viewsets (logika endpoint), router (membuat URL otomatis sesuai konvensi REST), serta Browsable API (halaman HTML interaktif untuk mencoba API langsung dari browser tanpa Postman).

Browsable API adalah fitur andalan DRF. Setiap endpoint punya tampilan HTML yang bisa kamu buka langsung di browser untuk melihat data, mengirim POST, atau mengedit — sangat memudahkan proses development dan debugging.

Prasyarat

Untuk mengikuti tutorial ini, kamu butuh: Python 3.8+, Django 4.x/5.x, dan pemahaman dasar tentang model Django (konsep model, migration, dan admin). Kalau kamu belum pernah install Python, cek Cara Install Python dan Menulis Program Pertamamu.

Langkah 1: Menyiapkan Proyek

Buat virtual environment, install Django dan DRF, lalu buat proyek beserta satu aplikasi bernama books.

bash
mkdir drf-tutorial && cd drf-tutorial
python -m venv venv
source venv/bin/activate   # Windows: venv\Scripts\activate
pip install django djangorestframework
django-admin startproject config .
python manage.py startapp books

Selanjutnya, daftarkan rest_framework dan aplikasi books ke INSTALLED_APPS di config/settings.py.

python
# config/settings.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',   # tambahkan ini
    'books',            # tambahkan ini
]

Langkah 2: Membuat Model

Kita akan membuat model Book yang merepresentasikan buku. Model ini nantinya menjadi sumber data API kita.

python
# books/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(blank=True)
    published_year = models.IntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)

    def __str__(self):
        return self.title
bash
python manage.py makemigrations books
python manage.py migrate

Langkah 3: Membuat Serializer

Serializer mengubah objek Book menjadi JSON (dan sebaliknya). Dengan ModelSerializer, DRF meng-generate field otomatis dari model kita — kamu tidak perlu menulis konversi manual satu per satu.

python
# books/serializers.py
from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

Langkah 4: Membuat ViewSet

Dengan ModelViewSet, kita langsung mendapat endpoint lengkap CRUD (list, create, retrieve, update, delete) hanya dalam beberapa baris kode.

python
# books/views.py
from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer

Langkah 5: Mengatur URL dengan Router

Router akan membuat URL REST secara otomatis: /api/books/ untuk list & create, serta /api/books/1/ untuk retrieve, update, dan delete.

python
# config/urls.py
from django.contrib import admin
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from books.views import BookViewSet

router = DefaultRouter()
router.register(r'books', BookViewSet)

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),
]
bash
python manage.py runserver

Sekarang buka http://127.0.0.1:8000/api/books/ di browser. Kamu akan melihat Browsable API DRF yang interaktif.

Langkah 6: Menguji API

Kita bisa menguji endpoint dengan curl. Pertama, kirim data buku baru lewat POST:

bash
curl -X POST http://127.0.0.1:8000/api/books/ \
  -H "Content-Type: application/json" \
  -d '{"title": "Clean Code", "author": "Robert C. Martin", "published_year": 2008, "price": "350000.00"}'

DRF akan merespons dengan data buku yang baru dibuat beserta status HTTP 201 Created:

json
{
  "id": 1,
  "title": "Clean Code",
  "author": "Robert C. Martin",
  "description": "",
  "published_year": 2008,
  "price": "350000.00"
}

Lalu ambil daftar semua buku dengan GET, atau ambil satu buku berdasarkan id:

bash
# Ambil semua buku
curl http://127.0.0.1:8000/api/books/

# Ambil buku dengan id 1
curl http://127.0.0.1:8000/api/books/1/

# Update buku (PUT)
curl -X PUT http://127.0.0.1:8000/api/books/1/ \
  -H "Content-Type: application/json" \
  -d '{"title": "Clean Code (Updated)", "author": "Robert C. Martin", "published_year": 2008, "price": "375000.00"}'

# Hapus buku (DELETE)
curl -X DELETE http://127.0.0.1:8000/api/books/1/

API produksi tidak boleh mengembalikan semua data sekaligus. Aktifkan pagination dan filtering lewat pengaturan global di config/settings.py. Untuk filtering, install django-filter terlebih dahulu.

bash
pip install django-filter
python
# config/settings.py
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
    'DEFAULT_FILTER_BACKENDS': [
        'django_filters.rest_framework.DjangoFilterBackend',
        'rest_framework.filters.SearchFilter',
    ],
}

Lalu tentukan field mana yang bisa difilter dan dicari di books/views.py.

python
# books/views.py
from rest_framework import viewsets
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter
from .models import Book
from .serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ['author', 'published_year']
    search_fields = ['title', 'author']
bash
# Filter berdasarkan author
curl "http://127.0.0.1:8000/api/books/?author=Robert%20C.%20Martin"

# Search berdasarkan judul
curl "http://127.0.0.1:8000/api/books/?search=Clean"

# Pagination
curl "http://127.0.0.1:8000/api/books/?page=2"

Langkah 8: Autentikasi dan Permission

Secara default, DRF mengizinkan akses tanpa login (AllowAny). Untuk API produksi, kamu bisa membatasi akses dengan menambahkan permission_classes. DRF mendukung SessionAuthentication, TokenAuthentication, dan bisa diintegrasikan dengan JWT lewat library djangorestframework-simplejwt.

python
# books/views.py
from rest_framework import viewsets, permissions
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter
from .models import Book
from .serializers import BookSerializer

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ['author', 'published_year']
    search_fields = ['title', 'author']
    # Hanya user yang sudah login yang bisa akses
    permission_classes = [permissions.IsAuthenticated]

Jangan pernah mengandalkan permission default untuk API yang menyimpan data sensitif. Selalu set permission_classes secara eksplisit dan uji endpoint dengan user yang tidak login untuk memastikan akses benar-benar ditolak (HTTP 403).

Kesimpulan

Kamu baru saja membangun REST API lengkap dengan Django REST Framework — dari model, serializer, viewset, router, pagination, filtering, sampai autentikasi. DRF membuat pengembangan API jadi jauh lebih cepat dan konsisten. Kalau kamu ingin membandingkan dengan pendekatan lain, cek juga tutorial Cara Membuat REST API dengan FastAPI yang lebih ringan dan async-friendly. Selamat membangun API pertamamu!