ORM 모델을 JSON 형식으로 직렬화하고, 폼 데이터를 검증하며 데이터 생성 및 수정을 수행하는 방법에 대해 설명합니다.
직렬화 클래스의 생성자 매개변수:
#1. instance: ORM 객체나 쿼리셋 객체를 전달하여 ORM 모델을 JSON으로 변환합니다.
#2. data: 검증할 데이터를 전달하여 유효성 여부를 확인합니다.
#3. many: instance가 쿼리셋일 경우 True로 설정합니다.
class 상점직렬화(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
이름 = serializers.CharField(max_length=200, required=True, error_messages={"required":"필수 입력 항목입니다."})
로고 = serializers.CharField(max_length=200, required=True)
주소 = serializers.CharField(max_length=200, required=True)
알림 = serializers.CharField(max_length=200, required=False)
최소주문금액 = serializers.DecimalField(required=False, max_digits=6, decimal_places=2)
경도 = serializers.FloatField(required=True)
위도 = serializers.FloatField(required=True)
def update(self, instance, validated_data):
instance.이름 = validated_data.get('이름', instance.이름)
instance.로고 = validated_data.get('로고', instance.로고)
instance.주소 = validated_data.get('주소', instance.주소)
instance.알림 = validated_data.get('알림', instance.알림)
instance.최소주문금액 = validated_data.get('최소주문금액', instance.최소주문금액)
instance.경도 = validated_data.get('경도', instance.경도)
instance.위도 = validated_data.get('위도', instance.위도)
instance.save()
return instance
def create(self, validated_data):
return 상점.objects.create(**validated_data)
views.py:
from .models import 상점
from .serializers import 상점직렬화
from django.http.response import JsonResponse
from django.views.decorators.http import require_http_methods
@require_http_methods(['GET','POST'])
def 상점뷰(request):
if request.method == 'GET':
상점들 = 상점.objects.all()
직렬화기 = 상점직렬화(상점들, many=True)
return JsonResponse(직렬화기.data, safe=False)
else:
직렬화기 = 상점직렬화(data=request.POST)
if 직렬화기.is_valid():
직렬화기.save()
return JsonResponse(직렬화기.data, status=200)
return JsonResponse(직렬화기.errors, status=400)
from django.urls import path
from .views import 상점뷰
urlpatterns=[
path('/상점/', 상점뷰, name="상점")
]
중첩된 직렬화
때로는 하나의 직렬화 클래스에서 다른 모델의 데이터를 포함해야 할 수 있습니다. 이때 중첩된 직렬화를 사용합니다. 예를 들어 GoodsCategory 모델에서 Merchant와 그 하위 상품(Goods) 정보를 가져오는 경우 다음과 같이 작성할 수 있습니다.
class 상품직렬화(serializers.ModelSerializer):
class Meta:
model = Goods
fields = "__all__"
class 상점직렬화(serializers.ModelSerializer):
class Meta:
model = 상점
fields = "__all__"
class 상품분류직렬화(serializers.ModelSerializer):
상점 = 상점직렬화(read_only=True, required=False)
상품목록 = 상품직렬화(many=True, required=False)
상점_id = serializers.IntegerField(required=True, write_only=True)
class Meta:
model = GoodsCategory
fields = "__all__"
def validate_상점_id(self, value):
if not 상점.objects.filter(pk=value).exists():
raise serializers.ValidationError("존재하지 않는 상점입니다!")
return value
def create(self, validated_data):
상점_id = validated_data.get('상점_id')
상점객체 = 상점.objects.get(pk=상점_id)
분류 = GoodsCategory.objects.create(name=validated_data.get('name'), merchant=상점객체)
return 분류
@require_http_methods(['GET','POST'])
def 상품분류뷰(request):
if request.method == 'GET':
분류들 = GoodsCategory.objects.all()
직렬화기 = 상품분류직렬화(분류들, many=True)
return JsonResponse(직렬화기.data, safe=False)
else:
직렬화기 = 상품분류직렬화(data=request.POST)
if 직렬화기.is_valid():
직렬화기.save()
return JsonResponse(직렬화기.data)
else:
return JsonResponse(직렬화기.errors, status=400)