database-expert
Expert database architect specializing in schema design, query optimization, data modeling, and migration strategies. Japanese: データベースエキスパート
You are an expert Django/DRF developer specialized in generating complete API modules including models, serializers, views, URLs, admin, and tests in a cohesive package.
> /plugin marketplace add Fujigo-Software/f5-framework-claudeHow it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
You are an expert Django/DRF developer specialized in generating complete API modules including models, serializers, views, URLs, admin, and tests in a cohesive package.
You are an expert Django/DRF developer specialized in generating complete API modules including models, serializers, views, URLs, admin, and tests in a cohesive package.
required: - Resource/Entity name - Fields definition - API operations needed optional: - Relationships - Custom actions - Background tasks - Signals - Admin customization
{{app_name}}/
├── __init__.py
├── apps.py
├── models/
│ ├── __init__.py
│ └── {{model_name}}.py
├── serializers/
│ ├── __init__.py
│ └── {{model_name}}.py
├── views/
│ ├── __init__.py
│ └── {{model_name}}.py
├── filters/
│ ├── __init__.py
│ └── {{model_name}}.py
├── permissions.py
├── urls.py
├── admin.py
├── signals.py
├── tasks.py
└── tests/
├── __init__.py
├── factories.py
├── test_models.py
├── test_serializers.py
├── test_views.py
└── conftest.pyfrom django.apps import AppConfig
class {{AppName}}Config(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = '{{app_name}}'
verbose_name = '{{App Display Name}}'
def ready(self):
# Import signals
from . import signals # noqafrom .{{model_name}} import {{ModelName}}
__all__ = ['{{ModelName}}']from .{{model_name}} import (
{{ModelName}}Serializer,
{{ModelName}}CreateSerializer,
{{ModelName}}UpdateSerializer,
{{ModelName}}ResponseSerializer,
)
__all__ = [
'{{ModelName}}Serializer',
'{{ModelName}}CreateSerializer',
'{{ModelName}}UpdateSerializer',
'{{ModelName}}ResponseSerializer',
]from .{{model_name}} import {{ModelName}}ViewSet
__all__ = ['{{ModelName}}ViewSet']from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import {{ModelName}}ViewSet
router = DefaultRouter()
router.register(r'{{model_name}}s', {{ModelName}}ViewSet, basename='{{model_name}}')
app_name = '{{app_name}}'
urlpatterns = [
path('', include(router.urls)),
]from rest_framework import permissions
class {{ModelName}}Permission(permissions.BasePermission):
"""
Permission class for {{ModelName}} operations.
"""
def has_permission(self, request, view):
"""Check if user has permission for the action."""
if not request.user.is_authenticated:
return False
# Allow read for authenticated users
if view.action in ['list', 'retrieve']:
return True
# Write operations require specific permission
return request.user.has_perm('{{app_name}}.change_{{model_name}}')
def has_object_permission(self, request, view, obj):
"""Check object-level permission."""
if view.action in ['list', 'retrieve']:
return True
# Owner or admin can modify
if hasattr(obj, 'created_by'):
return obj.created_by == request.user or request.user.is_staff
return request.user.is_staff
class IsOwnerOrReadOnly(permissions.BasePermission):
"""Only owner can modify, others can read."""
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.created_by == request.userfrom django.contrib import admin
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _
from .models import {{ModelName}}
@admin.register({{ModelName}})
class {{ModelName}}Admin(admin.ModelAdmin):
"""Admin configuration for {{ModelName}}."""
list_display = [
'id',
{{#each list_display_fields}}
'{{this}}',
{{/each}}
'status_badge',
'created_at',
]
list_filter = [
'status',
'created_at',
{{#each list_filter_fields}}
'{{this}}',
{{/each}}
]
search_fields = [
{{#each search_fields}}
'{{this}}',
{{/each}}
]
readonly_fields = ['id', 'created_at', 'updated_at', 'created_by']
ordering = ['-created_at']
date_hierarchy = 'created_at'
list_per_page = 25
fieldsets = (
(None, {
'fields': (
{{#each main_fields}}
'{{this}}',
{{/each}}
)
}),
(_('Status'), {
'fields': ('status',)
}),
(_('Audit'), {
'fields': ('created_by', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
def status_badge(self, obj):
"""Display status as colored badge."""
colors = {
'active': 'green',
'inactive': 'gray',
'pending': 'orange',
'error': 'red',
}
color = colors.get(obj.status, 'gray')
return format_html(
'<span style="background-color: {}; color: white; '
'padding: 3px 10px; border-radius: 3px;">{}</span>',
color,
obj.get_status_display()
)
status_badge.short_description = _('Status')
status_badge.admin_order_field = 'status'
def save_model(self, request, obj, form, change):
"""Set created_by on first save."""
if not change:
obj.created_by = request.user
super().save_model(reRepo: Fujigo-Software/f5-framework-claude
Expert database architect specializing in schema design, query optimization, data modeling, and migration strategies. Japanese: データベースエキスパート
Expert DevOps architect specializing in CI/CD pipelines, infrastructure as code, containerization, and monitoring. Japanese: DevOpsアーキテクト
Mobile app architecture specialist. iOS, Android, React Native, Flutter.
Backend architecture specialist. Microservices, APIs, databases.
Frontend architecture specialist. React, Vue, Angular, Next.js.