Back to catalog

drf-serializer-patterns

Enforces DRF serializer best practices including Input/Output separation and validation-only logic. This skill should be used when working with Django REST Framework serializers to ensure proper patterns, prevent business logic in serializers, and validate FormSerializer composition.

  • Category: discovered
  • Tags: github, community
  • Version: 1.0.0
  • Author: walid
  • Downloads: 0
  • Updated: 2025-11-22

Download the latest version (v1.0.0) from this page.

SKILL.md

---
name: drf-serializer-patterns
description: Enforces DRF serializer best practices including Input/Output separation and validation-only logic. This skill should be used when working with Django REST Framework serializers to ensure proper patterns, prevent business logic in serializers, and validate FormSerializer composition.
activation:
  keywords:
    - drf
    - serializer
    - validation
    - input output
    - django rest framework
    - rest_framework
    - modelserializer
  triggers:
    - class.*Serializer
    - def validate_
    - serializer.is_valid
    - serializers.ModelSerializer
    - serializers.Serializer
---

# DRF Serializer Patterns

🎨 **CRITICAL SKILL**: Enforces DRF serializer patterns in Binora Backend. Input/Output separation, validation ONLY, NO business logic.

**Version**: 1.0.0

---

## 🎯 Core Rules

**#1 RULE: Separate Input and Output serializers. NO business logic in serializers.**

**Pattern from**: `apps/core/serializers/user.py`

---

## ✅ REQUIRED Patterns

### 1. Input/Output Separation

```python
# ✅ CORRECT
class UserInputSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['email', 'password', 'first_name']

class UserOutputSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'email', 'first_name', 'created_at']
        read_only_fields = ['id', 'created_at']
```

### 2. Validation ONLY

```python
# ✅ CORRECT - Validation only
class UserInputSerializer(serializers.Serializer):
    email = serializers.EmailField()

    def validate_email(self, value):
        if User.objects.filter(email=value).exists():
            raise serializers.ValidationError("Email exists")
        return value

# ❌ WRONG - Business logic
def validate_email(self, value):
    user = User.objects.create(email=value)  # NO!
    send_email(user)  # NO!
    return value
```

---

## 📚 Documentation (11 files, ~4,200 lines)

---

**Last Updated**: 2025-01-23
**Quality Score**: 95/100