Install
openclaw skills install drfDjango REST Framework scaffolding best practices, and gotchas.
openclaw skills install drfThis skill details how to generate, configure, and enhance REST APIs using Django + Django REST Framework (DRF). It includes instructions on project setup, API structure, serializers, viewsets, routing, authentication, performance optimization, testing, and common pitfalls.
Use this skill when you:
djangorestframework in its requirements.txt or pyproject.tomlpython3 -m venv .venv
source .venv/bin/activate
pip install django djangorestframework
django-admin startproject project .
python manage.py startapp [appname or "api"]
Add to settings.py:
INSTALLED_APPS = [
"rest_framework",
appname or "api",
]
REST_FRAMEWORK = {
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticated",
],
"DEFAULT_RENDERER_CLASSES": [
"rest_framework.renderers.JSONRenderer",
],
"DEFAULT_FILTER_BACKENDS": [
"django_filters.rest_framework.DjangoFilterBackend",
],
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
"PAGE_SIZE": 10,
}
ModelSerializer to reduce boilerplate.serializers.py file inside the appropriate Django appExample:
# File: accounts/serializers.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ["id", "username", "email"]
ViewSet or ModelViewSet for standard CRUD APIs.get_queryset() instead of filtering in the serializer.views.py file inside the appropriate Django appExample:
# File: accounts/views.py
class UserViewSet(ModelViewSet):
serializer_class = UserSerializer
def get_queryset(self):
return User.objects.filter(is_active=True)
urls.py file inside the appropriate Django appurls.py inside the Django app is included in the main urls.pyExample:
# File: accounts/urls.py
router = DefaultRouter()
router.register("users", UserViewSet)
urlpatterns = router.urls
Example:
# File: project/urls.py
urlpatterns = [
path("", include("accounts.urls")),
]
IsAuthenticated) rather than open.permissions.py file inside the appropriate Django app.Example:
permission_classes = [IsAuthenticated]
get_queryset() using request parameters.Protect APIs from abuse:
REST_FRAMEWORK = {
"DEFAULT_THROTTLE_CLASSES": [
"rest_framework.throttling.AnonRateThrottle",
"rest_framework.throttling.UserRateThrottle",
],
"DEFAULT_THROTTLE_RATES": {
"anon": "100/day",
"user": "1000/day",
},
}
select_related() for foreign keys.prefetch_related() for many-to-many and reverse relations.Example:
# File: orders/views.py
def get_queryset(self):
return Order.objects.select_related("customer").prefetch_related("items")
APITestCase and APIClient.Avoid putting business logic inside: - serializers - views - permission classes
Instead, use: - service modules - domain logic in models - reusable helper functions
DRF does not optimize queries automatically. Missing
select_related() or prefetch_related() will silently destroy
performance.
Common mistakes: - Forgetting permission classes - Allowing unauthenticated access by default - Exposing writeable fields unintentionally - Exposing passwords or secret fields in response
Always audit:
- serializer fields
- permission classes
- allowed HTTP methods
Django REST Framework is primarily synchronous.
Do not assume: - async views improve performance automatically - background tasks belong in request/response cycles
Use task queues (Celery etc.) for long-running work.
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver