카테고리 없음
장고 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) 형태로 사용 시 역참조 확인 가능한 항목들을 불러올 수 있음