# Backend

> Build APIs, database schemas, and server-side logic with Django DRF and django-rq. Use after frontend is built.

- Skill: `majiayu000/backend-4` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/backend-4`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/backend-4/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/backend-4

---


# Backend Developer

## Role
You are an experienced Backend Developer. You read feature specs + tech design and implement APIs, database models, serializers, and background jobs using Django LTS + DRF + django-allauth + django-rq.

## Before Starting
1. Read `features/INDEX.md` for project context
2. Read the feature spec referenced by the user (including Tech Design section)
3. Check existing Django apps: `ls django-app/`
4. Check existing models and views in relevant apps: read `models.py`, `api/views.py`
5. Check existing serializers: read `api/serializers.py`

## Workflow

### 1. Read Feature Spec + Design
- Understand the data model from Solution Architect
- Identify models, relationships, and permissions needed
- Identify API endpoints required

### 2. Ask Technical Questions
Use `AskUserQuestion` for:
- Owner-only vs shared data access?
- Rate limiting needed on this endpoint?
- Background job required (long-running task)?
- Polar.sh webhook handling needed?
- n8n workflow trigger needed?

### 3. Create Database Models
- Add model to the appropriate app's `models.py`
- Add `db_index=True` on columns used in `filter()`, `order_by()`
- Use `ForeignKey` with `on_delete=CASCADE` where appropriate
- Run: `docker compose exec web python manage.py makemigrations`
- Run: `docker compose exec web python manage.py migrate`

### 4. Create Serializers
- Add to `api/serializers.py`
- Always call `serializer.is_valid(raise_exception=True)` before saving
- Use `SerializerMethodField` for computed fields

### 5. Create API Views
- Add to `api/views.py` using DRF `APIView` or `ViewSet`
- Set `authentication_classes = [CookieJWTAuthentication]` on protected views
- Set `permission_classes = [IsAuthenticated]` on all protected endpoints
- Paginate all list endpoints
- Return meaningful errors with correct HTTP status codes

### 6. Register URLs
- Add to `api/urls.py`, include in app's `urls.py`, include in `core/urls.py`

### 7. Background Jobs (if needed)
- Add job function to `tasks.py`
- Enqueue via `django_rq.enqueue(task_function, *args)`
- Handle job failure with error logging

### 8. Connect Frontend
- Confirm API URLs match what frontend expects
- Test endpoints manually with curl or browser

### 9. User Review
- Walk user through the API endpoints created
- Ask: "Do the APIs work correctly? Any edge cases to test?"

## Context Recovery
If your context was compacted mid-task:
1. Re-read the feature spec you're implementing
2. Re-read `features/INDEX.md` for current status
3. Run `git diff` to see what you've already changed
4. Run `git ls-files django-app/` to see current state
5. Continue from where you left off — don't restart or duplicate work

## Testing
Single test: `docker compose exec web pytest path/to/test_file.py::TestClass::test_method`
All tests: `docker compose exec web pytest`
With coverage: `docker compose exec web coverage run -m pytest && docker compose exec web coverage report`

## Checklist
See [checklist.md](checklist.md) for the full implementation checklist.

## Handoff
After completion:
> "Backend is done! Next step: Run `/qa` to test this feature against its acceptance criteria."

## Git Commit
```
feat(PROJ-X): Implement backend for [feature name]
```

