카테고리 없음

장고 DRF 역 참조, serializer

abccoco 2022. 6. 17. 21:08

역참조

나를 참조하는 table 접근하는것이다.

다른 객체가 ForeignKey를 가지고 있거나 N:N 관계인 상황, 해당 객체를 참조하고 있는 다른 객체를 참조하려는 경우

 

# One-to-one 관계기 때문에 _set이 붙지 않는다.

#Many-to-many 관계기 때문에 _set이 붙는다.

# ForeignKey를 사용했을 떄 또한 _set이 붙는다.

 

serializers

# 코드

serializers 사용할때 Meta class가 중요하다.

fields에 새로운 field를 추가할 때에는
변수명 = serializers.SerializerMethodField()
def get_변수명 (self, obj):
    return "test"
를 해 주어야 한다

# serializers.py

class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserProfile # 중요 models.py의 model
        fields = "__all__" # 중요 models.py의 field
        # frelds에 적어주는 정보에 따라 어떤 정보를 제이슨 형식으로 받을지 정해진다 이메일, 유저네임 하면 이메일 유저네임을 받을 수 있다.

class UserSerializer(serializers.ModelSerializer):
    """
    외래 키는 UserProfile에서 User 테이블로 설정되어 있지만
    one to one 필드기 때문에 userprofile이라는 명칭으로 역참조가 가능하다.
    """
    userprofile = UserProfileSerializer()
    class Meta:
        model = User
        fields = ["username", "password", "fullname", "email", "userprofile"]

 

serializers.py 를 views.py 에 임포트 해서 사용한다

# 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 옵션을 사용해야 한다.
    # one to one:  오브젝
    # many to many: 쿼리셋
    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"
}
"""

 

기타

# exclde : 매칭 된 쿼리만 제외, filter와 반대

# annotate : 필드 이름을 변경해주기 위해 사용, 이외에도 원하는 필드를 추가하는 등 다양하게 활용 가능

# values / values_list : 지정한 필드만 리턴 할 수 있음. values는 dict로 return, values_list는 tuple로 ruturn

# F() : 객체에 해당되는 쿼리를 생성함: F('user__username') F는 안에 있는 스트링을 쿼리로 바꾸어 준다.

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