ORM 모델의 JSON 직렬화

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)

태그: ORM Django Serializer ViewSet JsonResponse

7월 4일 19:21에 게시됨