Django 모델 인스턴스 직렬화 방법
Django 모델 인스턴스 직렬화 방법
직렬화기(Serializer) 사용
Django REST Framework(DRF)는 모델 인스턴스를 JSON, XML 등 다양한 형식으로 직렬화하는 데 사용할 수 있는 직렬화기 클래스를 제공합니다.
1 기본 직렬화기
모델 인스턴스를 직렬화하는 가장 간단한 방법은 ModelSerializer
클래스를 사용하는 것입니다. ModelSerializer
는 모델 필드를 기반으로 자동으로 직렬화기 필드를 생성합니다.
from django.contrib.auth.models import User
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
# 사용 예시
user = User.objects.get(username='bard')
serializer = UserSerializer(user)
serialized_data = serializer.data
2 직렬화기 필드 정의
ModelSerializer
클래스를 사용하면 모델 필드를 직접 정의할 수도 있습니다.
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email', 'last_login')
# 'last_login' 필드를 직렬화 형식으로 변환
last_login = serializers.DateTimeField(format='%Y-%m-%d')
3 사용자 지정 직렬화기
더 복잡한 직렬화 로직을 구현하려면 Serializer
클래스를 직접 사용하여 사용자 지정 직렬화기를 만들 수 있습니다.
from django.contrib.auth.models import User
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
username = serializers.CharField(max_length=255)
email = serializers.EmailField()
# 'last_login' 필드를 직렬화 형식으로 변환
last_login = serializers.DateTimeField(format='%Y-%m-%d')
def create(self, validated_data):
# 유효성 검사된 데이터로 새로운 User 인스턴스 생성
return User.objects.create(**validated_data)
def update(self, instance, validated_data):
# 기존 User 인스턴스 업데이트
instance.username = validated_data.get('username', instance.username)
instance.email = validated_data.get('email', instance.email)
instance.last_login = validated_data.get('last_login', instance.last_login)
instance.save()
return instance
직접 직렬화
모델 인스턴스를 직접 직렬화하는 방법도 있습니다.
from django.contrib.auth.models import User
user = User.objects.get(username='bard')
# 모델 인스턴스를 딕셔너리로 변환
serialized_data = {
'id': user.id,
'username': user.username,
'email': user.email,
'last_login': user.last_login.strftime('%Y-%m-%d'),
}
참고 자료
예제 코드
직렬화기(Serializer) 사용
from django.contrib.auth.models import User
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
# 사용 예시
user = User.objects.get(username='bard')
serializer = UserSerializer(user)
serialized_data = serializer.data
print(serialized_data)
출력 결과
{
"id": 1,
"username": "bard",
"email": "[email protected]"
}
from django.contrib.auth.models import User
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email', 'last_login')
# 'last_login' 필드를 직렬화 형식으로 변환
last_login = serializers.DateTimeField(format='%Y-%m-%d')
# 사용 예시
user = User.objects.get(username='bard')
serializer = UserSerializer(user)
serialized_data = serializer.data
print(serialized_data)
{
"id": 1,
"username": "bard",
"email": "[email protected]",
"last_login": "2023-11-14"
}
from django.contrib.auth.models import User
from rest_framework import serializers
class UserSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
username = serializers.CharField(max_length=255)
email = serializers.EmailField()
# 'last_login' 필드를 직렬화 형식으로 변환
last_login = serializers.DateTimeField(format='%Y-%m-%d')
def create(self, validated_data):
# 유효성 검사된 데이터로 새로운 User 인스턴스 생성
return User.objects.create(**validated_data)
def update(self, instance, validated_data):
# 기존 User 인스턴스 업데이트
instance.username = validated_data.get('username', instance.username)
instance.email = validated_data.get('email', instance.email)
instance.last_login = validated_data.get('last_login', instance.last_login)
instance.save()
return instance
# 사용 예시
user = User.objects.get(username='bard')
serializer = UserSerializer(user)
serialized_data = serializer.data
print(serialized_data)
{
"id": 1,
"username": "bard",
"email": "[email protected]",
"last_login": "2023-11-14"
}
직접 직렬화
from django.contrib.auth.models import User
user = User.objects.get(username='bard')
# 모델 인스턴스를 딕셔너리로 변환
serialized_data = {
'id': user.id,
'username': user.username,
'email': user.email,
'last_login': user.last_login.strftime('%Y-%m-%d'),
}
print(serialized_data)
{
"id": 1,
"username": "bard",
"email": "[email protected]",
"last_login": "2023-11-14"
}
Django 모델 인스턴스 직렬화 대체 방법
pickle
Python의 pickle
모듈을 사용하여 모델 인스턴스를 직렬화할 수 있습니다.
from django.contrib.auth.models import User
import pickle
user = User.objects.get(username='bard')
# 모델 인스턴스를 직렬화
serialized_data = pickle.dumps(user)
# 직렬화된 데이터를 역직렬화
deserialized_user = pickle.loads(serialized_data)
print(deserialized_user)
<User: bard>
jsonpickle
jsonpickle
라이브러리를 사용하여 모델 인스턴스를 JSON 형식으로 직렬화할 수 있습니다.
from django.contrib.auth.models import User
import jsonpickle
user = User.objects.get(username='bard')
# 모델 인스턴스를 직렬화
serialized_data = jsonpickle.dumps(user)
# 직렬화된 데이터를 역직렬화
deserialized_user = jsonpickle.loads(serialized_data)
print(deserialized_user)
{
"id": 1,
"username": "bard",
"email": "[email protected]",
"password": "pbkdf2_sha256$10000$s8z42bF3v8yG$64f072a5414904229f74492184a4323124439273983289614215672321320000",
"is_staff": false,
"is_active": true,
"is_superuser": false,
"last_login": "2023-11-14T15:23:32.123456Z",
"date_joined": "2023-11-14T15:23:32.123456Z",
"groups": [],
"user_permissions": []
}
marshmallow
from django.contrib.auth.models import User
from marshmallow import Schema, fields
class UserSchema(Schema):
id = fields.Int()
username = fields.Str()
email = fields.Email()
user = User.objects.get(username='bard')
# 모델 인스턴스를 직렬화
serializer = UserSchema()
serialized_data = serializer.dump(user)
# 직렬화된 데이터를 역직렬화
deserialized_user = serializer.load(serialized_data)
print(deserialized_user)
{'id': 1, 'username': 'bard', 'email': '[email protected]'}
선택 가이드
직렬화 방법을 선택할 때 다음 사항을 고려해야 합니다.
- 사용 편의성: 직렬화기(Serializer)는 사용하기 가장 간편하지만, 사용자 지정 기능이 제한적입니다.
- 직렬화 형식: 특정 형식이 필요하다면 해당 형식을 지원하는 라이브러리를 선택해야 합니다.
- 성능: 직렬화 속도가 중요하다면 pickle을 사용하는 것이 좋습니다.
- 확장성: 향후 더 많은 기능을 추가할 계획이라면 marshmallow와 같은 라이브러리를 사용하는 것이 좋습니다.
참고 자료
django django-models