Serializer๋?
1. Serializer ์ ์
Serializer(์ง๋ ฌํ)๋ Django REST Framework(DRF)์์ Python ๊ฐ์ฒด(QuerySet, Model ์ธ์คํด์ค ๋ฑ)๋ฅผ
JSON ํ์์ผ๋ก ๋ณํํ๊ฑฐ๋(JSON ์ง๋ ฌํ), ๋ฐ๋๋ก JSON ๋ฐ์ดํฐ๋ฅผ Python ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ธฐ๋ฅ(์ญ์ง๋ ฌํ)์
์ํํ๋ ํด๋์ค์ ๋๋ค.
โ ์ฝ๊ฒ ๋งํ๋ฉด:
- Python ๊ฐ์ฒด → JSON ๋ณํ (`์ง๋ ฌํ`)
- JSON → Python ๊ฐ์ฒด ๋ณํ (`์ญ์ง๋ ฌํ`)
๐ Serializer๋ฅผ ์ฌ์ฉํ๋ ์ด์
- API์์ ๋ฐ์ดํฐ๋ฅผ JSON ํํ๋ก ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ํ์
- Django์ ๋ชจ๋ธ์ ์ฝ๊ฒ JSON ์๋ต์ผ๋ก ๋ณํ ๊ฐ๋ฅ
- ํด๋ผ์ด์ธํธ์์ ๋ฐ์ JSON ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆ ๋ฐ ๋ณํํ์ฌ ์์ ํ๊ฒ DB ์ ์ฅ ๊ฐ๋ฅ
2. Serializer ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
Serializer๋ฅผ ๋ง๋ค๋ ค๋ฉด `serializers.Serializer` ๋๋ `serializers.ModelSerializer`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
โ `serializers.Serializer` ๊ธฐ๋ณธ ์ฌ์ฉ
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
username = serializers.CharField(max_length=100)
email = serializers.EmailField()
is_active = serializers.BooleanField()
โ `serializers.Serializer`๋ฅผ ์์๋ฐ์ ํด๋์ค๋ฅผ ์ ์
โ `CharField`, `EmailField`, `BooleanField` ๋ฑ์ ํ๋ ์ง์
๋ฐ์ดํฐ ์ง๋ ฌํ (Python ๊ฐ์ฒด → JSON)
user_data = {"username": "john_doe", "email": "john@example.com", "is_active": True}
serializer = UserSerializer(user_data)
print(serializer.data)
# {'username': 'john_doe', 'email': 'john@example.com', 'is_active': True}
โ `.data` ์์ฑ์ ์ฌ์ฉํ๋ฉด JSON ํ์์ผ๋ก ๋ณํ๋จ
๋ฐ์ดํฐ ์ญ์ง๋ ฌํ (JSON → Python ๊ฐ์ฒด)
json_data = {'username': 'john_doe', 'email': 'john@example.com', 'is_active': True}
serializer = UserSerializer(data=json_data)
if serializer.is_valid(): # ์ ํจ์ฑ ๊ฒ์ฌ
print(serializer.validated_data)
# {'username': 'john_doe', 'email': 'john@example.com', 'is_active': True}
else:
print(serializer.errors)
โ `data` ๋งค๊ฐ๋ณ์๋ก JSON ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ , `is_valid()`๋ก ๊ฒ์ฆ ํ `validated_data`์์ ๋ณํ๋ ๋ฐ์ดํฐ ํ์ธ ๊ฐ๋ฅ
3. ModelSerializer ์ฌ์ฉํ๊ธฐ (๋ ์ฌ์ด ๋ฐฉ๋ฒ!)
Django์ Model๊ณผ ์ฐ๊ฒฐ๋ Serializer๋ฅผ ๋ง๋ค๋ ค๋ฉด `serializers.ModelSerializer`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๐ `ModelSerializer`๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ธ์ ํ๋์ ๋ง๋ Serializer๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค
โ `ModelSerializer` ๊ธฐ๋ณธ ์ฌ์ฉ
from rest_framework import serializers
from myapp.models import User # Django ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'email', 'is_active'] # ์ฌ์ฉํ ํ๋ ์ง์
โ `ModelSerializer`๋ `Meta` ํด๋์ค๋ฅผ ์ฌ์ฉํด ๋ชจ๋ธ๊ณผ ํ๋๋ฅผ ์๋์ผ๋ก ์ค์
โ ์ฅ์ : ๋ชจ๋ธ ํ๋์ ๋ง๋ Serializer๋ฅผ ์๋์ผ๋ก ์์ฑํ์ฌ ์ฝ๋๋์ด ์ค์ด๋ฆ
ModelSerializer๋ก ์ง๋ ฌํ
user = User.objects.get(id=1)
serializer = UserSerializer(user)
print(serializer.data)
# {'id': 1, 'username': 'john_doe', 'email': 'john@example.com', 'is_active': True}
โ ORM ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ๋ณํํด์ค
ModelSerializer๋ก ์ญ์ง๋ ฌํ
json_data = {'username': 'john_doe', 'email': 'john@example.com', 'is_active': True}
serializer = UserSerializer(data=json_data)
if serializer.is_valid():
user = serializer.save() # ๋ฐ์ดํฐ ์ ์ฅ
print(user) # User ๋ชจ๋ธ ์ธ์คํด์ค ์์ฑ๋จ
โ `save()`๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ DB์ ์ ์ฅ ๊ฐ๋ฅ
4. Serializer์์ ์ถ๊ฐ ๊ธฐ๋ฅ ํ์ฉ
โ ํ๋์ ๊ธฐ๋ณธ ๊ฐ ์ค์
class UserSerializer(serializers.ModelSerializer):
username = serializers.CharField(default="guest") # ๊ธฐ๋ณธ๊ฐ ์ค์
class Meta:
model = User
fields = '__all__'
โ `default="guest"`๋ฅผ ์ค์ ํ๋ฉด ๊ฐ์ด ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ ์ ์ฉ
โ ํ๋ ์ฝ๊ธฐ ์ ์ฉ / ์ฐ๊ธฐ ์ ์ฉ ์ค์
class UserSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only=True) # ์ฝ๊ธฐ ์ ์ฉ
username = serializers.CharField(write_only=True) # ์ฐ๊ธฐ ์ ์ฉ
class Meta:
model = User
fields = '__all__'
โ `read_only=True` → ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์
โ `write_only=True` → ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋๋ง ์ฌ์ฉ, ์๋ต์๋ ํฌํจ๋์ง ์์
โ ํ๋ ์ถ๊ฐ & ์ปค์คํ ํ๋ ์์ฑ
class UserSerializer(serializers.ModelSerializer):
full_name = serializers.SerializerMethodField() # ์ปค์คํ
ํ๋ ์ถ๊ฐ
class Meta:
model = User
fields = ['id', 'username', 'email', 'full_name']
def get_full_name(self, obj): # obj๋ User ์ธ์คํด์ค
return f"{obj.first_name} {obj.last_name}"
โ `SerializerMethodField()`๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ธ์ ์๋ ํ๋๋ ์ถ๊ฐ ๊ฐ๋ฅ
โ `get_<ํ๋๋ช
>(self, obj)` ๋ฉ์๋๋ฅผ ์ ์ํ์ฌ ๊ฐ ์ค์
5. Serializer์ ์ ํจ์ฑ ๊ฒ์ฌ (Validation)
Serializer์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ์ ํจ์ฑ ๊ฒ์ฌ(Validation)๋ฅผ ์ถ๊ฐํ ์ ์์
โ ํ๋๋ณ ๊ธฐ๋ณธ ์ ํจ์ฑ ๊ฒ์ฌ
class UserSerializer(serializers.ModelSerializer):
email = serializers.EmailField(required=True) # ํ์ ์
๋ ฅ
username = serializers.CharField(min_length=3) # ์ต์ ๊ธธ์ด ์ ํ
class Meta:
model = User
fields = '__all__'
โ `required=True` → ํ์ ์
๋ ฅ ํ๋ ์ง์
โ `min_length=3` → ์ต์ 3์ ์ด์ ์
๋ ฅํด์ผ ํจ
โ ์ปค์คํ ์ ํจ์ฑ ๊ฒ์ฌ (validate_ํ๋๋ช )
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
def validate_username(self, value):
if "admin" in value.lower():
raise serializers.ValidationError("username์ 'admin'์ ํฌํจํ ์ ์์ต๋๋ค.")
return value
โ `validate_<ํ๋๋ช >` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ํ๋์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฌ ๊ฐ๋ฅ
โ ๊ฐ์ฒด ์์ค์ ์ ํจ์ฑ ๊ฒ์ฌ (`validate()`)
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
def validate(self, data):
if data['password'] != data['password_confirm']:
raise serializers.ValidationError("๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ์ง ์์ต๋๋ค.")
return data
โ `validate(self, data)`๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ํ๋๋ฅผ ํจ๊ป ๊ฒ์ฆ ๊ฐ๋ฅ
6. Serializer ์ ๋ฆฌ
๊ธฐ๋ฅ | `serializers.Serializer` | `serializers.ModelSerializer` |
์ฌ์ฉ ๋ฐฉ์ | ์๋์ผ๋ก ํ๋ ์ ์ | ๋ชจ๋ธ๊ณผ ์ฐ๊ฒฐํ์ฌ ํ๋๋ฅผ ์๋ ์์ฑ |
์ฝ๋๋ | ๋ง์ | ์ ์ |
์ ํจ์ฑ ๊ฒ์ฌ | validate_<ํ๋๋ช > ์ฌ์ฉ | ๋์ผ |
๋ฐ์ดํฐ ์ ์ฅ | ์ง์ `save()` ๊ตฌํํด์ผ ํจ | `serializer.save()` ์ฌ์ฉ ๊ฐ๋ฅ |
๐น ๊ฒฐ๋ก
- Serializer๋ Django์ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ JSON์ผ๋ก ๋ณํํ๊ณ , JSON์ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ก ๋ณํํ๋ ์ญํ
- `serializers.Serializer`๋ ์ง์ ํ๋๋ฅผ ์ ์ํด์ผ ํ์ง๋ง, `ModelSerializer`๋ ๋ชจ๋ธ ๊ธฐ๋ฐ์ผ๋ก ์๋ ์ค์ ๊ฐ๋ฅ
- ์ ํจ์ฑ ๊ฒ์ฌ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๊ณ , ์์ ํ๊ฒ API์ ์ฐ๋ํ ์ ์์
- Serializer๋ฅผ ์ฌ์ฉํ๋ฉด Django ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ API๋ก ๋ง๋ค ์ ์์
'AI ๐ค > Django โ๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[250204] URI ์ดํดํ๊ธฐ (0) | 2025.02.04 |
---|---|
[250131] django DRF(Django Rest Framework)๋~ (0) | 2025.01.31 |
[250122] DateTimeField() ๊ฐ๋ ์ ๋ฆฌ~ (0) | 2025.01.22 |
[250121] ์ฟผ๋ฆฌ์ (QuerySet)์ด๋? (0) | 2025.01.21 |
[250120] HttpResponse์ render์ ์ฐจ์ด์ (1) | 2025.01.20 |