You are an expert in Python, Django, and scalable RESTful API development.
Core Principles
- Django-First Approach: Use Django's built-in features and tools wherever possible to leverage its full capabilities
- Code Quality: Prioritize readability and maintainability; follow Django's coding style guide (PEP 8 compliance)
- Naming Conventions: Use descriptive variable and function names; adhere to naming conventions (lowercase with underscores for functions and variables)
- Modular Architecture: Structure your project in a modular way using Django apps to promote reusability and separation of concerns
- Performance Awareness: Always consider scalability and performance implications in your design decisions
Project Structure
Application Structure
app_name/
├── migrations/ # Database migration files
├── admin.py # Django admin configuration
├── apps.py # App configuration
├── models.py # Database models
├── managers.py # Custom model managers
├── signals.py # Django signals
├── tasks.py # Celery tasks (if applicable)
└── __init__.py # Package initialization
API Structure
api/
└── v1/
├── app_name/
│ ├── urls.py # URL routing
│ ├── serializers.py # Data serialization
│ ├── views.py # API views
│ ├── permissions.py # Custom permissions
│ ├── filters.py # Custom filters
│ └── validators.py # Custom validators
└── urls.py # Main API URL configuration
Core Structure
core/
├── responses.py # Unified response structures
├── pagination.py # Custom pagination classes
├── permissions.py # Base permission classes
├── exceptions.py # Custom exception handlers
├── middleware.py # Custom middleware
├── logging.py # Structured logging utilities
└── validators.py # Reusable validators
Configuration Structure
config/
├── settings/
│ ├── base.py # Base settings
│ ├── development.py # Development settings
│ ├── staging.py # Staging settings
│ └── production.py # Production settings
├── urls.py # Main URL configuration
└── wsgi.py # WSGI configuration
Django/Python Development Guidelines
Views and API Design
- Use Class-Based Views: Leverage Django's class-based views (CBVs) with DRF's APIViews
- RESTful Design: Follow RESTful principles strictly with proper HTTP methods and status codes
- Keep Views Light: Focus views on request handling; keep business logic in models, managers, and services
- Consistent Response Format: Use unified response structure for both success and error cases
Models and Database
- ORM First: Leverage Django's ORM for database interactions; avoid raw SQL queries unless necessary for performance
- Business Logic in Models: Keep business logic in models and custom managers
- Query Optimization: Use select_related and prefetch_related for related object fetching
- Database Indexing: Implement proper database indexing for frequently queried fields
- Transactions: Use transaction.atomic() for data consistency in critical operations
Serializers and Validation
- DRF Serializers: Use Django REST Framework serializers for data validation and serialization
- Custom Validation: Implement custom validators for complex business rules
- Field-Level Validation: Use serializer field validation for input sanitization
- Nested Serializers: Properly handle nested relationships with appropriate serializers
Authentication and Permissions
- JWT Authentication: Use djangorestframework_simplejwt for JWT token-based authentication
- Custom Permissions: Implement granular permission classes for different user roles
- Security Best Practices: Implement proper CSRF protection, CORS configuration, and input sanitization
URL Configuration
- URL Patterns: Use urlpatterns to define clean URL patterns with each path() mapping routes to views
- Nested Routing: Use include() for modular URL organization
- API Versioning: Implement proper API versioning strategy (URL-based versioning recommended)
Performance and Scalability
Query Optimization
- N+1 Problem Prevention: Always use select_related and prefetch_related appropriately
- Query Monitoring: Monitor query counts and execution time in development
- Database Connection Pooling: Implement connection pooling for high-traffic applications
- Caching Strategy: Use Django's cache framework with Redis/Memcached for frequently accessed data
Response Optimization
- Pagination: Standardize pagination across all list endpoints
- Field Selection: Allow clients to specify required fields to reduce payload size
- Compression: Enable response compression for large payloads
Error Handling and Logging
Unified Error Responses
{
"success": false,
"message": "Error description",
"errors": {
"field_name": ["Specific error details"]
},
"error_code": "SPECIFIC_ERROR_CODE"
}
Exception Handling
- Custom Exception Handler: Implement global exception handling for consistent error responses
- Django Signals: Use Django signals to decouple error handling and post-model activities
- Proper HTTP Status Codes: Use appropriate HTTP status codes (400, 401, 403, 404, 422, 500, etc.)
Logging Strategy
- Structured Logging: Implement structured logging for API monitoring and debugging
- Request/Response Logging: Log API calls with execution time, user info, and response status
- Performance Monitoring: Log slow queries and performance bottlenecks