django특강(serialzer), 스터디, 타임어택

김하진·2022년 6월 17일
1

오늘은 아침스터디, 그리고 이어지는 django특강, 타임어택까찌
아침7시부터 지금 저녁9시가 넘었는데 시간이 정말 후딱 간것 같다.

외래키

아직 관계형DB에 관한 이해가 조금은 부족한 것 같다.

정한이 형이 얘기해준 차원얘기도 도움이 되지만 내걸로 만들려면 좀더 딥한 이해가 필요하다

  • ForeignKey : many-to-one 형태로 특정 테이블에서 다른 테이블을 참조 할 수 있다,
    • 영화관과 시청자의 관계를 나타 낼 때, 시청자 테이블에서 영화관 테이블을 Foreign Key를 사용해 관계를 맺을 수 있다.
  • OneToOneField : one-to-one 형태로 ForeignKey와 동일하지만, 1:1 관계만 가능하다.
    • 사용자 계정 테이블과 사용자 프로필 테이블이 별도로 존재 할 때, 계정 테이블을 프로필에서 1:1로 관계를 맺을 수 있다.
  • ManyToManyField : many-to-many 형태로 한 개의 필드에서 여러개의 테이블을 참조 할 수 있다.
    • 영화라는 테이블에서 카테고리 테이블의 object를 참조하고 싶을 때, many to many 관계를 사용해 2개 이상의 object를 참조할 수 있다.
    • Many-to-many 관계로 생성 된 필드는 db에 값이 2개 이상 저장되는 것이 아닌, 중간 테이블이 생성된다.

역참조에 대한 이해

  • 외래 키를 사용해 참조하는 object를 역으로 찾을 수 있다.
    • 왜래 키 지정 시 related_name 옵션을 사용해 역참조 시 사용될 이름을 지정할 수 있다.
    • releated_name을 지정하지 않는다면 기본적으로 tablename_set 형태로 지정된다.
    • ex1) user_profile.hobby → 정참조
    • ex2) hobby.userprofile_set → hobby를 참조하고 있는 UserProfile 테이블의 object를 져옴
      • models.py에서 releated_name을 user_hobby 로 지정했다면 hobby.user_hobby와 같이 사용

역참조 또한 정참조, 역참조 의 대한 개념에 대한 이해가 필요하다
앞으로 많은 queryset 과 object 들을 컨트롤 하려면 이것에 대한 정확한 이해가 필요 한 것 같다.

python에는 객체에 존재하는 변수, 메소드 등을 출력해주는 dir()이라는 함수가 존재

특정 object를 dir(object) 형태로 사용 시 역참조 확인 가능한 항목들을 불러올 수 있음

drf의 꽃, serializer 활용

serialzer 란?

  • django의 object, queryset 인스턴스 등 복잡한 테이터들을 json같은 다른 콘텐츠 유형으로 쉽게 변환 할 수 있다.
  • create, update 시 validation 기능을 제공한다.

기본적인 사용법

  • serializers.py
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
   class Meta:
        # serializer에 사용될 model, field지정
        model = User
        # 모든 필드를 사용하고 싶을 경우 fields = "__all__"로 사용
        fields = ["username", "password", "fullname", "email"]
  • views.py
from rest_framework.response import Response
from rest_framework import status

from user.serializers import UserSerializer

def get(self, request):
    user = request.user
    # serializer에 queryset을 인자로 줄 경우 many=True 옵션을 사용해야 한다.
    serialized_user_data = UserSerializer(user).data
    return Response(serialized_user_data, status=status.HTTP_200_OK)

# return data
"""
{
    "username": "user",
    "password": "pbkdf2_sha256$320000$u5YnmKo9luab9csqWpzRsa$pKfqHnBiF5Rgdo1Mj9nxNOdhpAl9AhPVXFPXkbPz7Mg=",
    "fullname": "user's name",
    "email": "user@email.com"
}
"""

또한 외래키 관계에 있는 테이블이 있을 경우, serializer 를 생성해서 함께 사용 할 수 있다.
그리고 SerializerMethodField를 활용해 원하는 필드를 추가하고, 더 나아가서 여러 serializer들을 함께 사용할 수 있다.

장고의 꽃이라고 부를만하다. 그동안 구현하기 어려웠던, 복잡한던 로직을 직관적이고 아주 편하게 사용할 수 있을 것 같다.

말이 편하다 이지만, 이것에 대한 완벽한 이해는 필요 할 것 같다.

오늘 저녁에는 타임어택후 타임어택에 대한 복습을 하였다. 내일은 주말이지만 drf 과제가 남아있다.

요즘 조금 피곤하긴 하지만 그만큼 공부가 재밌어지고, 팀원들이랑 스터디 하는게 굉장히 도움이 많이 되고 재밌다.

앞으로도 개속 재밌게 공부하자!

profile
진킴

0개의 댓글