Django
The Django skill provides expertise in Django web framework including ORM, class-based views, and Django REST Framework.
When Activated
Section titled “When Activated”- Python web applications
- Admin interfaces
- Django REST Framework APIs
- Working with Django projects
Core Patterns
Section titled “Core Patterns”Models
Section titled “Models”from django.db import models
class User(models.Model): email = models.EmailField(unique=True) name = models.CharField(max_length=100) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True)
class Meta: ordering = ['-created_at'] indexes = [ models.Index(fields=['email']), ]
def __str__(self): return self.emailViews (Class-based)
Section titled “Views (Class-based)”from django.views.generic import ListView, DetailView, CreateView
class UserListView(ListView): model = User template_name = 'users/list.html' context_object_name = 'users' paginate_by = 20
class UserDetailView(DetailView): model = User template_name = 'users/detail.html' context_object_name = 'user'
class UserCreateView(CreateView): model = User fields = ['email', 'name'] template_name = 'users/create.html' success_url = '/users/'Django REST Framework
Section titled “Django REST Framework”from rest_framework import serializers, viewsetsfrom rest_framework.decorators import actionfrom rest_framework.response import Response
class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['id', 'email', 'name', 'created_at'] read_only_fields = ['created_at']
class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer
@action(detail=True, methods=['post']) def activate(self, request, pk=None): user = self.get_object() user.is_active = True user.save() return Response({'status': 'activated'})from django.urls import path, includefrom rest_framework.routers import DefaultRouter
router = DefaultRouter()router.register('users', UserViewSet)
urlpatterns = [ path('api/', include(router.urls)), path('users/', UserListView.as_view(), name='user-list'), path('users/<int:pk>/', UserDetailView.as_view(), name='user-detail'),]Best Practices
Section titled “Best Practices”- Use class-based views for standard CRUD
- Define model methods for business logic
- Use serializers for validation
- Add proper permissions
- Use select_related/prefetch_related for queries
Common Pitfalls
Section titled “Common Pitfalls”N+1 Queries
Section titled “N+1 Queries”# ❌ BAD: N+1 query problemusers = User.objects.all()for user in users: print(user.profile.bio) # Separate query for each user
# ✅ GOOD: Use select_relatedusers = User.objects.select_related('profile').all()for user in users: print(user.profile.bio) # Single queryMissing Migrations
Section titled “Missing Migrations”# ❌ BAD: Forgetting migrations# After changing models, forgetting to:python manage.py makemigrationspython manage.py migrate
# ✅ GOOD: Always create and run migrationspython manage.py makemigrationspython manage.py migrateNo Validation
Section titled “No Validation”# ❌ BAD: Direct model creationuser = User.objects.create(email=request.POST['email'])
# ✅ GOOD: Use serializer for validationserializer = UserSerializer(data=request.data)if serializer.is_valid(): user = serializer.save()else: return Response(serializer.errors, status=400)Advanced Patterns
Section titled “Advanced Patterns”Custom Managers
Section titled “Custom Managers”class ActiveUserManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(is_active=True)
class User(models.Model): # ... objects = models.Manager() active = ActiveUserManager()
# Usageall_users = User.objects.all()active_users = User.active.all()Signals
Section titled “Signals”from django.db.models.signals import post_savefrom django.dispatch import receiver
@receiver(post_save, sender=User)def create_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance)Permissions
Section titled “Permissions”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 UserViewSet(viewsets.ModelViewSet): permission_classes = [IsOwnerOrReadOnly] # ...Pagination
Section titled “Pagination”from rest_framework.pagination import PageNumberPagination
class StandardResultsSetPagination(PageNumberPagination): page_size = 20 page_size_query_param = 'page_size' max_page_size = 100
class UserViewSet(viewsets.ModelViewSet): pagination_class = StandardResultsSetPagination # ...Testing
Section titled “Testing”from django.test import TestCasefrom rest_framework.test import APITestCase
class UserModelTest(TestCase): def test_create_user(self): user = User.objects.create( email='test@example.com', name='Test User' ) self.assertEqual(user.email, 'test@example.com')
class UserAPITest(APITestCase): def test_list_users(self): response = self.client.get('/api/users/') self.assertEqual(response.status_code, 200)
def test_create_user(self): data = {'email': 'new@example.com', 'name': 'New User'} response = self.client.post('/api/users/', data) self.assertEqual(response.status_code, 201)Related Skills
Section titled “Related Skills”- Python - Python language
- PostgreSQL - Database
- pytest - Testing
- OpenAPI - API documentation