Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/tomevault-io/skills-registry --skill django-drf-skill명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
| Use when this capability is needed.
> Use when this capability is needed.
Review architecture and API design for the vfs-s3 project. Use when the user mentions @architect, asks to review an issue's design, discuss module boundaries, API shape, or architectural decisions for vfs-s3. Also trigger when the user wants to create an ADR (Architecture Decision Record) or evaluate a technical approach for the project. Intended for dispatch from Codex automation or Claude routines; GitHub trigger phrase: @vfs-s3-bot please prepare design doc Use when this capability is needed.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | django-drf-skill |
| description | > Use when this capability is needed. |
project/
manage.py
project/
settings.py
urls.py
wsgi.py
apps/
users/
models.py
serializers.py
views.py
urls.py
filters.py
from rest_framework import serializers
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'email', 'first_name', 'last_name']
read_only_fields = ['id']
class UserDetailSerializer(UserSerializer):
groups = serializers.StringRelatedField(many=True)
class Meta(UserSerializer.Meta):
fields = UserSerializer.Meta.fields + ['groups', 'date_joined']
class CommentSerializer(serializers.ModelSerializer):
author = UserSerializer(read_only=True)
author_id = serializers.PrimaryKeyRelatedField(
queryset=User.objects.all(),
source='author',
write_only=True
)
class Meta:
model = Comment
fields = ['id', 'content', 'author', 'author_id', 'created_at']
read_only_fields = ['id', 'created_at']
from rest_framework import viewsets, permissions
from django.contrib.auth.models import User
from .serializers import UserSerializer
class UserViewSet(viewsets.ModelViewSet):
"""
API endpoint for users.
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
permission_classes = [permissions.IsAuthenticated]
filterset_fields = ['username', 'email', 'is_active']
search_fields = ['username', 'email']
ordering_fields = ['username', 'date_joined']
ordering = ['-date_joined']
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
@action(detail=True, methods=['post'])
def set_password(self, request, pk=None):
user = self.get_object()
serializer = PasswordSerializer(data=request.data)
if serializer.is_valid():
user.set_password(serializer.validated_data['password'])
user.save()
return Response({'status': 'password set'})
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@action(detail=False, methods=['get'])
def recent(self, request):
recent_users = User.objects.order_by('-date_joined')[:10]
serializer = self.get_serializer(recent_users, many=True)
return Response(serializer.data)
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.owner == request.user
class IsAdminUser(permissions.BasePermission):
def has_permission(self, request, view):
return request.user and request.user.is_staff
# filters.py
from rest_framework import filters
class UserFilter(filters.FilterSet):
username = filters.CharFilter(lookup_expr='icontains')
is_active = filters.BooleanFilter()
created_after = filters.DateTimeFilter(field_name='date_joined', lookup_expr='gte')
class Meta:
model = User
fields = ['username', 'is_active', 'created_after']
# app/urls.py
from rest_framework.routers import DefaultRouter
from .views import UserViewSet
router = DefaultRouter()
router.register(r'users', UserViewSet)
urlpatterns = [
path('', include(router.urls)),
]
# settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 20,
'DEFAULT_FILTER_BACKENDS': [
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.SearchFilter',
'rest_framework.filters.OrderingFilter',
],
}
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
],
}
from rest_framework.views import exception_handler
from rest_framework.response import Response
def custom_exception_handler(exc, context):
response = exception_handler(exc, context)
if response is not None:
response.data['status_code'] = response.status_code
return response
| Component | Purpose |
|---|---|
| ModelSerializer | Auto-generate from model |
| ViewSet | CRUD operations |
| Router | URL generation |
| FilterSet | Query filtering |
| Permission | Access control |
| Pagination | Response pagination |
Source: EmmanuelOrtiz87/gentle-vanguard — distributed by TomeVault.