DRF Router Cheat Sheet Dashboard

✅ SimpleRouter

A lightweight router that maps basic CRUD operations.

URLMethodActionName
{prefix}/GETlist{basename}-list
{prefix}/POSTcreate-
{prefix}/{lookup}/GETretrieve{basename}-detail
{prefix}/{lookup}/PUTupdate-
{prefix}/{lookup}/PATCHpartial_update-
{prefix}/{lookup}/DELETEdestroy-

✅ DefaultRouter

Extends SimpleRouter with an API root and format suffixes.

URLMethodActionName
[.format]GETAPI Rootapi-root
{prefix}/[.format]GETlist{basename}-list
{prefix}/[.format]POSTcreate-
{prefix}/{lookup}/[.format]GETretrieve{basename}-detail
{prefix}/{lookup}/[.format]PUTupdate-
{prefix}/{lookup}/[.format]PATCHpartial_update-
{prefix}/{lookup}/[.format]DELETEdestroy-

🔗 Quick Comparison Table

FeatureSimpleRouterDefaultRouterCustom Router
CRUD Actions✅ (customizable)
API Root View❌ (manual)
Format Suffixes
Trailing Slash Control
Custom Path Rules

🌐 SimpleRouter URL Patterns

URLMethodActionName
{prefix}/GETlist{basename}-list
{prefix}/{lookup}/GETretrieve{basename}-detail

🌐 DefaultRouter URL Patterns

URLMethodActionName
{prefix}/[.format]GETlist{basename}-list
{prefix}/{lookup}/[.format]GETretrieve{basename}-detail

🛠️ Key Router Methods

MethodPurpose
get_urls()Defines URL patterns.
get_default_basename()Auto-generates basename.
self.registryStores (prefix, viewset, basename).

🔗 Comparison Table

FeatureSimpleRouterDefaultRouter
CRUD Actions
API Root View
Format Suffixes
Custom Path Rules

💡 Pro Tips

💎 Third Party Helpers

PackagePurpose
drf-nested-routersNested resources (like /users/5/orders/).
wq.db.restAuto-registers models like Django Admin.
drf-extensionsMore router customization.

🔧 Custom Router Examples

Build your own router when you need to break free of the default behavior.

1️⃣ Add a Global 'health-check' Route


from rest_framework.routers import DefaultRouter

class HealthCheckRouter(DefaultRouter):
    def get_urls(self):
        urls = super().get_urls()
        urls.append(path('health/', self.health_check, name='health-check'))
        return urls

    def health_check(self, request):
        return JsonResponse({'status': 'ok'})
        

2️⃣ No Trailing Slash Router


from rest_framework.routers import SimpleRouter

class NoSlashRouter(SimpleRouter):
    trailing_slash = ''
        

3️⃣ Custom Router with Global List-All


from rest_framework.routers import SimpleRouter

class ListAllRouter(SimpleRouter):
    def get_urls(self):
        urls = super().get_urls()
        urls.append(path('all/', self.list_all, name='list-all'))
        return urls

    def list_all(self, request):
        return Response({'detail': 'Custom list-all here'})
        

🚨 Common Pitfalls & How to Dodge Them