skills/backend/django/SKILL.md
Django best practices baseadas em cookiecutter-django e produção real
npx skillsauth add lucasbiason/cursor-multiagent-system django-best-practicesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Convenções baseadas em cookiecutter-django e experiência de produção.
project/
├── config/ # Settings (base, local, production, test)
│ ├── settings/
│ │ ├── base.py
│ │ ├── local.py
│ │ ├── production.py
│ │ └── test.py
│ ├── urls.py
│ └── wsgi.py
├── apps/ # Aplicações Django
│ ├── users/
│ │ ├── models/
│ │ │ ├── __init__.py
│ │ │ └── user.py
│ │ ├── views/
│ │ ├── serializers/
│ │ └── admin.py
│ └── core/
├── static/
├── media/
├── templates/
├── locale/
├── requirements/
│ ├── base.txt
│ ├── local.txt
│ └── production.txt
└── manage.py
Quando um módulo tem mais de uma classe, cada classe deve estar em um arquivo separado:
# ❌ ERRADO
apps/users/models.py:
- User
- Profile
- Role
# ✅ CORRETO
apps/users/models/
├── __init__.py # Exporta todas
├── user.py # class User
├── profile.py # class Profile
└── role.py # class Role
Usar django-environ para configuração via variáveis de ambiente:
import environ
env = environ.Env()
DEBUG = env.bool("DEBUG", default=False)
SECRET_KEY = env("SECRET_KEY")
DATABASES = {
"default": env.db("DATABASE_URL")
}
base.py - Configurações comunslocal.py - Desenvolvimento localproduction.py - Produçãotest.py - TestesSEMPRE usar custom user model desde o início:
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
email = models.EmailField(unique=True)
# Campos customizados aqui
USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["username"]
class SoftDeleteModel(models.Model):
is_active = models.BooleanField(default=True)
deleted_at = models.DateTimeField(null=True, blank=True)
class Meta:
abstract = True
def soft_delete(self):
self.is_active = False
self.deleted_at = timezone.now()
self.save()
TODO E QUALQUER AGENTE ESTÁ PROIBIDO DE MEXER EM MIGRATIONS JÁ APLICADAS:
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ["id", "email", "username"]
read_only_fields = ["id"]
from rest_framework import viewsets
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.filter(is_active=True)
serializer_class = UserSerializer
permission_classes = [IsAuthenticated]
Para queries complexas, usar SQL puro com proteção:
Referência obrigatória (template/snippet do cursor-multiagent-system):
core/templates/database/django-sql-snippets.py - Funções genéricas para SQL puro (Django) com proteção contra SQL injectionfrom core.templates.database.django_sql_snippets import sql_to_dict, sql_to_list, query_value, exec_sql
# Exemplo: Obter resultados como lista de dicionários
results = sql_to_dict(
"SELECT * FROM users WHERE email = %s",
param=("[email protected]",)
)
# Exemplo: Obter valor único
count = query_value("SELECT COUNT(*) FROM users")
# Exemplo: Executar update/insert
exec_sql(
"UPDATE users SET status = 'active' WHERE id = %s",
param=(user_id,)
)
Para consultas repetitivas, usar cache Redis:
Referência obrigatória (template/snippet do cursor-multiagent-system):
core/templates/cache/redis-cache-snippet.py - Sistema de cache Redis genérico (Django e standalone)from core.templates.cache.redis_cache_snippet import CacheSystem
from django.conf import settings
# Configurar cache (exemplo com Django settings)
cache = CacheSystem(
host=settings.REDIS_HOST,
port=settings.REDIS_PORT,
password=getattr(settings, 'REDIS_PASSWORD', None),
db=0
)
def get_user_profile(user_id):
cache_key = f"user_profile:{user_id}"
cached = cache.read(cache_key)
if cached:
return cached
profile = User.objects.get(id=user_id)
cache.save(cache_key, profile_data, expiration=3600)
return profile
testing
Execução e análise de testes automatizados
development
Gera resumos didáticos extensos e estruturados de aulas/cursos para cards do Notion. Use ao resumir aulas, apostilas, transcrições ou materiais de estudo para incluir no corpo do card (não apenas no campo Descrição), com flashcards, exemplos de código, diagramas Mermaid, mapa conceitual e perguntas de reforço.
development
Padroniza documentação existente no formato canônico Spec-Driven. Remove duplicação e melhora rastreabilidade.
development
Processo universal e repetível para criar especificações a partir de qualquer input (texto, docs, código). Usado em Plan mode.