Django Rest Framework URLs - Panduan Lengkap
1. Basic URLs
URL Dasar
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('products/', views.product_list),
path('products/<int:pk>/', views.product_detail),
]
URL dengan Format Suffix
# urls.py
from rest_framework.urlpatterns import format_suffix_patterns
urlpatterns = [
path('products/', views.product_list),
path('products/<int:pk>/', views.product_detail),
]
urlpatterns = format_suffix_patterns(urlpatterns)
# Memungkinkan akses seperti /products.json atau /products.api
2. Router
Simple Router
# urls.py
from rest_framework import routers
from . import views
router = routers.SimpleRouter()
router.register(r'products', views.ProductViewSet)
urlpatterns = router.urls
Default Router
# urls.py
from rest_framework import routers
from . import views
router = routers.DefaultRouter()
router.register(r'products', views.ProductViewSet)
router.register(r'categories', views.CategoryViewSet)
urlpatterns = [
# Router URLs
path('api/', include(router.urls)),
# Login URL untuk browsable API
path('api-auth/', include('rest_framework.urls')),
]
3. Nested Router
# urls.py
from rest_framework_nested import routers
# Main router
router = routers.DefaultRouter()
router.register(r'categories', views.CategoryViewSet)
# Nested router
products_router = routers.NestedSimpleRouter(
router,
r'categories',
lookup='category'
)
products_router.register(
r'products',
views.ProductViewSet,
basename='category-products'
)
urlpatterns = [
path('api/', include(router.urls)),
path('api/', include(products_router.urls)),
]
4. URL dengan Versi
URL Based Versioning
# urls.py
urlpatterns = [
path('api/v1/products/', views.ProductListAPIView.as_view()),
path('api/v2/products/', views.ProductListAPIViewV2.as_view()),
]
Query Parameter Versioning
# settings.py
REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.QueryParameterVersioning',
'DEFAULT_VERSION': '1.0',
'ALLOWED_VERSIONS': ['1.0', '2.0'],
}
5. Contoh Implementasi Lengkap
Project Level URLs
# project/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('myapp.urls')),
path('api-auth/', include('rest_framework.urls')),
]
App Level URLs
# myapp/urls.py
from django.urls import path, include
from rest_framework import routers
from . import views
# Router utama
router = routers.DefaultRouter()
router.register(r'products', views.ProductViewSet)
router.register(r'categories', views.CategoryViewSet)
router.register(r'users', views.UserViewSet)
# URL patterns tambahan
extra_patterns = [
path('products/featured/',
views.FeaturedProductList.as_view(),
name='featured-products'),
path('products/search/',
views.ProductSearchView.as_view(),
name='product-search'),
]
urlpatterns = [
# Router URLs
path('', include(router.urls)),
# URL patterns tambahan
path('', include(extra_patterns)),
# Auth URLs
path('auth/', include('djoser.urls')),
path('auth/', include('djoser.urls.jwt')),
]
6. Tips Penggunaan URL
Custom URL Patterns
# urls.py
urlpatterns = [
# Custom action di ViewSet
path('products/<int:pk>/mark-featured/',
views.ProductViewSet.as_view({'post': 'mark_featured'}),
name='product-mark-featured'),
# Custom filter view
path('products/by-category/<int:category_id>/',
views.ProductByCategoryView.as_view(),
name='products-by-category'),
]
URL dengan Slug
# urls.py
urlpatterns = [
path('products/<slug:slug>/',
views.ProductDetailView.as_view(),
name='product-detail'),
]
Multiple Lookup Fields
# urls.py
urlpatterns = [
path('categories/<slug:category_slug>/products/<slug:product_slug>/',
views.ProductDetailView.as_view(),
name='product-detail'),
]
URL dengan Filter
# urls.py
urlpatterns = [
path('products/',
views.ProductListView.as_view(),
name='product-list'),
# Dapat diakses dengan: /products/?category=electronics&min_price=100
]