django drf 심화

김하진·2022년 6월 21일
0
# sample request.data
"""
{
    "username": "someuser",
    "password": "P@ssw0rd"
}
"""
class UserView(APIView):
    def post(self, request):
        # request.data의 dict 형태가 **를 붙임으로써 kwargs로 들어감
        UserModel.objects.create(**request.data)

** kwargs 사용

검색에서의 and 와 Q 활용

from django.db.models.query_utils import Q

class UserView(APIView)
    def get(self, request):
        # 취미 중 산책이 있거나 나이가 19살보다 많고 김씨인 사람만 필터 사람만 필터
        qyery = Q(hobby__name="산책") | Q(age__gt=19, user__name__startswith="김")

        # 취미 중 산책이 있으면서 나이가 19살보다 많은 사람만 필터
        qyery = Q(hobby__name="산책") & Q(age__gt=19)				
        user_profile_list = UserProfileModel.objects.filter(qyery)

validator 예시

from user.serializers import UserSerializer

...

class UserView(APIView):
    def post(self, request):
        # serializer의 data 인자에는 model로 지정 된 테이블의 field:value를 dictionary로 넘겨준다.
        user_serializer = UserSerializer(data=request.data)
        # serializer validator를 통과하지 않을 경우 .is_valid()가 False로 return된다.
        if user_serializer.is_valid():
            # validator를 통과했을 경우 데이터 저장
            user_serializer.save()
            return Response({"message": "정상"}, status=status.HTTP_200_OK)
        
        # .errors에는 validator에 실패한 필드와 실패 사유가 담겨져 있다.
        return Response(user_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

# sample request.data
"""
{
    "username": "new_user",
    "password": "MyL0ve1yP@ssw0rd",
    "fullname": "myname",
    "userprofile": {
        "introduction": "자기소개입니다.",
        "birthday": "2000-1-01",
        "age": 30
    },
    "trash": "zczxcvx"
}
"""

create

...
class UserProfileSerializer(serializers.ModelSerializer):
    # hobby는 데이터를 직렬화 할 때, get_hobbys는 profile을 등록할 떄 사용된다.
    hobby = HobbySerializer(many=True, required=False, read_only=True)
    get_hobbys = serializers.ListField(required=False)

    class Meta:
        model = UserProfile
        fields = ["birthday", "age", "introduction", "hobby", "get_hobbys"]

class UserSerializer(serializers.ModelSerializer):
    userprofile = UserProfileSerializer()
    def create(self, validated_data):
        # object를 생성할때 다른 데이터가 입력되는 것을 방지하기 위해 미리 pop 해준다.
        user_profile = validated_data.pop('userprofile')
        get_hobbys = user_profile.pop("get_hobbys", [])

        # User object 생성
        user = User(**validated_data)
        user.save()

        # UserProfile object 생성
        user_profile = UserProfile.objects.create(user=user, **user_profile)
        
        # hobby 등록
        user_profile.hobby.add(*get_hobbys)
        user_profile.save()
...
    class Meta:
        model = User
        fields = ["username", "password", "fullname", "email", "userprofile"]
...
# sample request data
"""
{
    "username": "user_name",
    "password": "H0t$ix",
    "fullname": "이름",
    "email": "sample@email.com",
    "userprofile": {
        "introduction": "자기소개입니다.",
        "birthday": "2000-1-01",
        "age": 13,
        "get_hobbys": [3,4,5,6]
    }
}
"""

validater 를 통과하고 그 이후에 create,update가 실행된다

많이 복잡하긴 하지만, 원리를 이해 해야 할 것 같다

profile
진킴

0개의 댓글