Django Team Workflows
Django Team Workflows
Section titled “Django Team Workflows”Establish effective team workflows for Django ORM performance optimization using DBCrust. This guide covers collaboration patterns, code review processes, performance monitoring, and team adoption strategies.
🚀 Quick Team Setup
Section titled “🚀 Quick Team Setup”1. Project Configuration
Section titled “1. Project Configuration”Create shared team configuration for consistent analysis:
# .dbcrust/team-config.toml (commit to version control)[analysis]enabled = truedetect_n_plus_one = truesuggest_indexes = truereport_threshold = 3
[standards]max_queries_per_view = 10max_query_duration_ms = 1000require_select_related = ["author", "category", "user"]require_prefetch_related = ["tags", "comments", "reviews"]
[team]enforce_performance_budgets = trueauto_fix_simple_issues = truerequire_approval_for_slow_queries = true2. Pre-commit Hooks
Section titled “2. Pre-commit Hooks”Prevent performance issues from entering the codebase:
repos: - repo: local hooks: - id: django-orm-check name: Django ORM Performance Check entry: python manage.py dbcrust_analyze_code --fail-on-critical language: system files: \.(py)$ pass_filenames: false
- id: django-migration-check name: Django Migration Safety Check entry: python manage.py dbcrust_migrate_check language: system files: migrations/.*\.py$ pass_filenames: false3. Shared Performance Baselines
Section titled “3. Shared Performance Baselines”{ "views": { "critical_views": { "user_dashboard": {"max_queries": 5, "max_duration": 500}, "product_list": {"max_queries": 8, "max_duration": 800}, "checkout_process": {"max_queries": 12, "max_duration": 1200} }, "standard_views": { "max_queries": 10, "max_duration": 1000 } }, "models": { "required_optimizations": { "User": ["profile", "permissions"], "Product": ["category", "brand"], "Order": ["user", "items__product"] } }}👥 Code Review Workflows
Section titled “👥 Code Review Workflows”Performance-Focused Code Reviews
Section titled “Performance-Focused Code Reviews”Automated Analysis in PRs:
name: Performance Review
on: pull_request: paths: ['**/*.py']
jobs: performance_review: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v4 with: python-version: '3.11'
- name: Install dependencies run: | pip install -r requirements.txt pip install dbcrust
- name: Analyze changed files run: | CHANGED_FILES=$(git diff --name-only origin/main...HEAD -- '*.py') python manage.py dbcrust_analyze_code --files $CHANGED_FILES --output pr_analysis.json
- name: Generate performance review comment uses: actions/github-script@v6 with: script: | const fs = require('fs'); const analysis = JSON.parse(fs.readFileSync('pr_analysis.json'));
let comment = '## 🔍 DBCrust Performance Review\n\n';
if (analysis.critical_issues.length > 0) { comment += '### 🔴 Critical Issues (Must Fix)\n'; analysis.critical_issues.forEach(issue => { comment += `- **${issue.type}**: ${issue.message} (${issue.file}:${issue.line})\n`; comment += ` 💡 **Fix**: ${issue.suggestion}\n\n`; }); }
if (analysis.optimization_opportunities.length > 0) { comment += '### 💡 Optimization Opportunities\n'; analysis.optimization_opportunities.forEach(opt => { comment += `- ${opt.message} (${opt.file}:${opt.line})\n`; }); }
if (analysis.critical_issues.length === 0 && analysis.optimization_opportunities.length === 0) { comment += '✅ No performance issues detected. Great work!\n'; }
github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: comment });Manual Review Checklist:
## Django ORM Performance Review Checklist
### Before Reviewing- [ ] Run `python manage.py dbcrust_analyze_code --files <changed_files>`- [ ] Check for new migrations with `python manage.py dbcrust_migrate_check`
### Code Review Points- [ ] **N+1 Queries**: Look for loops accessing related objects- [ ] **Missing select_related**: Check ForeignKey access patterns- [ ] **Missing prefetch_related**: Check Many-to-Many/Reverse FK access- [ ] **Inefficient filters**: Look for complex WHERE clauses- [ ] **Missing indexes**: Check frequently filtered/ordered fields
### View-Specific Checks- [ ] List views use pagination- [ ] Detail views use select_related for displayed relationships- [ ] Search/filter views have appropriate indexes- [ ] API endpoints meet performance budgets
### Migration Reviews- [ ] No dangerous operations in production migrations- [ ] Index additions use CONCURRENT where possible- [ ] Large table changes planned for maintenance windowsPerformance-Aware Git Hooks
Section titled “Performance-Aware Git Hooks”Pre-push Hook:
#!/bin/bashecho "🔍 Running Django ORM performance checks..."
# Check for critical performance issuespython manage.py dbcrust_analyze_code --fail-on-criticalif [ $? -ne 0 ]; then echo "❌ Critical performance issues detected. Push blocked." echo "Run 'python manage.py dbcrust_analyze_code' for details." exit 1fi
# Check migration safetypython manage.py dbcrust_migrate_check --fail-on-unsafeif [ $? -ne 0 ]; then echo "❌ Unsafe migrations detected. Push blocked." echo "Run 'python manage.py dbcrust_migrate_check' for details." exit 1fi
echo "✅ Performance checks passed."📊 Team Performance Monitoring
Section titled “📊 Team Performance Monitoring”Shared Performance Dashboard
Section titled “Shared Performance Dashboard”from django.shortcuts import renderfrom dbcrust.django.monitoring import get_team_metrics
def team_performance_dashboard(request): """Team performance monitoring dashboard"""
metrics = get_team_metrics(days=30)
context = { 'team_metrics': { 'total_views_analyzed': metrics['views_count'], 'critical_issues_found': metrics['critical_issues'], 'performance_improvements': metrics['improvements'], 'team_performance_score': metrics['team_score'] }, 'developer_metrics': [ { 'developer': dev['name'], 'commits_analyzed': dev['commits'], 'issues_introduced': dev['issues'], 'fixes_applied': dev['fixes'], 'performance_score': dev['score'] } for dev in metrics['by_developer'] ], 'recent_improvements': metrics['recent_improvements'][:10] }
return render(request, 'monitoring/team_dashboard.html', context)Performance Metrics Tracking
Section titled “Performance Metrics Tracking”DBCRUST_TEAM_MONITORING = { 'TRACK_BY_DEVELOPER': True, 'TRACK_BY_FEATURE': True, 'METRICS_RETENTION_DAYS': 90,
'ALERTS': { 'SLACK_WEBHOOK': os.getenv('SLACK_PERFORMANCE_WEBHOOK'), 'ALERT_ON_REGRESSION': True, 'ALERT_ON_CRITICAL_ISSUES': True, 'WEEKLY_TEAM_REPORT': True },
'GAMIFICATION': { 'ENABLE_SCORING': True, 'POINTS_FOR_FIXES': 10, 'POINTS_FOR_OPTIMIZATIONS': 5, 'PENALTY_FOR_REGRESSIONS': -15 }}Slack Integration
Section titled “Slack Integration”import requestsimport osfrom django.conf import settings
def send_performance_alert(issue_type, details): """Send performance alerts to Slack"""
webhook_url = getattr(settings, 'SLACK_PERFORMANCE_WEBHOOK', None) if not webhook_url: return
color_map = { 'critical': '#ff0000', 'warning': '#ffaa00', 'improvement': '#00ff00' }
message = { "attachments": [{ "color": color_map.get(issue_type, '#cccccc'), "title": f"🔍 Django ORM Performance Alert", "text": details['message'], "fields": [ { "title": "Issue Type", "value": details['type'], "short": True }, { "title": "Location", "value": f"{details['file']}:{details['line']}", "short": True }, { "title": "Fix Suggestion", "value": details['suggestion'], "short": False } ] }] }
requests.post(webhook_url, json=message)🎯 Team Training & Adoption
Section titled “🎯 Team Training & Adoption”Django ORM Performance Training Plan
Section titled “Django ORM Performance Training Plan”Week 1: Foundations
- Understanding N+1 queries and their impact
- Introduction to select_related() and prefetch_related()
- Hands-on: Setting up DBCrust in development
Week 2: Analysis Tools
- Using DBCrust middleware for real-time analysis
- Management commands for code analysis
- Interpreting performance reports
Week 3: Optimization Techniques
- Database indexing strategies
- Query optimization patterns
- Custom QuerySet methods
Week 4: Team Workflows
- Code review processes
- CI/CD integration
- Performance monitoring
Knowledge Sharing Sessions
Section titled “Knowledge Sharing Sessions”Monthly ORM Performance Review:
def generate_monthly_performance_report(): """Generate team knowledge sharing content"""
# Analyze common issues from last month common_issues = analyze_team_issues(days=30)
# Generate training content training_topics = []
if common_issues['n_plus_one_count'] > 5: training_topics.append({ 'topic': 'N+1 Query Prevention', 'examples': common_issues['n_plus_one_examples'], 'priority': 'high' })
if common_issues['missing_indexes'] > 3: training_topics.append({ 'topic': 'Database Indexing Strategies', 'examples': common_issues['index_examples'], 'priority': 'medium' })
return { 'training_topics': training_topics, 'team_improvements': common_issues['improvements'], 'success_stories': common_issues['success_stories'] }Performance Champions Program
Section titled “Performance Champions Program”Designate Performance Champions:
# Team performance champions configurationPERFORMANCE_CHAMPIONS = { 'backend_team': { 'champion': 'senior_dev@company.com', 'responsibilities': [ 'Review performance-critical PRs', 'Mentor junior developers on ORM optimization', 'Maintain team performance standards' ] }, 'frontend_team': { 'champion': 'frontend_lead@company.com', 'responsibilities': [ 'Review database queries from frontend', 'Optimize API endpoint performance', 'Coordinate with backend on data fetching' ] }}🛠️ Team Tools & Scripts
Section titled “🛠️ Team Tools & Scripts”Shared Development Scripts
Section titled “Shared Development Scripts”#!/bin/bashecho "🔍 Running team performance checks..."
# 1. Check current branch for issuesecho "Checking current branch..."python manage.py dbcrust_analyze_code --report summary
# 2. Compare with main branch performanceecho "Comparing with main branch..."git checkout mainpython manage.py dbcrust_profile_views --output main_performance.jsongit checkout -
python manage.py dbcrust_profile_views --output current_performance.jsonpython scripts/compare_performance.py main_performance.json current_performance.json
# 3. Check migration safetyif ls */migrations/*.py 1> /dev/null 2>&1; then echo "Checking migrations..." python manage.py dbcrust_migrate_checkfi
# 4. Run performance testsecho "Running performance tests..."python manage.py test tests.performance --keepdb
echo "✅ Team performance check complete!"Performance Issue Templates
Section titled “Performance Issue Templates”GitHub Issue Template:
---name: Performance Issueabout: Report Django ORM performance issuelabels: performance, django-orm---
## Performance Issue Report
### Issue Description<!-- Brief description of the performance issue -->
### DBCrust Analysis Output### Environment- Django version:- Database:- DBCrust version:
### Current Performance- Query count:- Duration:- Memory usage:
### Expected Performance- Target query count:- Target duration:
### Reproduction Steps1.2.3.
### Additional Context<!-- Any additional context about the issue -->Team Code Review Templates
Section titled “Team Code Review Templates”Pull Request Template:
## Performance Review Checklist
### Automated Checks- [ ] DBCrust analysis passed (check CI results)- [ ] Performance tests passed- [ ] Migration safety verified
### Manual Review- [ ] No new N+1 queries introduced- [ ] Appropriate use of select_related/prefetch_related- [ ] Database queries are efficient- [ ] No missing indexes for new filters/searches
### Performance Impact- [ ] No performance regression detected- [ ] Performance improvements documented- [ ] Performance budget maintained
### Documentation- [ ] Performance-critical code documented- [ ] Database schema changes documented- [ ] Migration rollback plan documented (if applicable)📈 Performance Culture
Section titled “📈 Performance Culture”Team Performance Goals
Section titled “Team Performance Goals”Quarterly OKRs Example:
Q1_2024_Performance_OKRs: objective: "Improve Django application performance" key_results: - reduce_average_page_load_time: target: "< 500ms" current: "800ms" metric: "average API response time"
- eliminate_n_plus_one_queries: target: "0 critical issues" current: "5 issues" metric: "DBCrust critical issue count"
- improve_database_efficiency: target: "< 5 queries per view average" current: "8 queries per view" metric: "average queries per view"Success Metrics
Section titled “Success Metrics”Team Performance Dashboard KPIs:
TEAM_PERFORMANCE_KPIS = { 'code_quality': { 'critical_issues_per_week': {'target': 0, 'weight': 40}, 'performance_regression_rate': {'target': 0, 'weight': 30}, 'optimization_adoption_rate': {'target': 95, 'weight': 20} }, 'development_velocity': { 'time_to_fix_issues': {'target': 24, 'weight': 30}, # hours 'performance_review_time': {'target': 2, 'weight': 20} # days }, 'knowledge_sharing': { 'team_training_completion': {'target': 100, 'weight': 25}, 'performance_champions_active': {'target': 2, 'weight': 15} }}🚨 Troubleshooting Team Issues
Section titled “🚨 Troubleshooting Team Issues”Common Team Adoption Challenges
Section titled “Common Team Adoption Challenges”Issue: Developers bypassing performance checks
# Solution: Make checks part of CI/CD pipelinerequired_status_checks: strict: true contexts: - "django-orm-performance-check" - "migration-safety-check"Issue: Too many false positives in analysis
# Solution: Customize analysis rules for your teamDBCRUST_TEAM_RULES = { 'IGNORE_PATTERNS': [ 'admin.*', # Skip Django admin 'test_.*', # Skip test files ], 'CUSTOM_THRESHOLDS': { 'n_plus_one_threshold': 5, # Adjust for your needs 'query_count_threshold': 15, }}Issue: Slow adoption of best practices
# Solution: Gamification and positive reinforcementPERFORMANCE_REWARDS = { 'performance_improvement_points': 50, 'n_plus_one_fix_points': 25, 'team_leaderboard': True, 'monthly_performance_champion': True}📚 See Also
Section titled “📚 See Also”- Django Middleware - Real-time ORM analysis setup
- CI/CD Integration - Automated performance testing
- Django Management Commands - CLI tools for teams
- Django ORM Analyzer - Complete analyzer documentation