Rest Framework
Urls

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
]