# 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 사용
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)
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"
}
"""
...
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가 실행된다
많이 복잡하긴 하지만, 원리를 이해 해야 할 것 같다