외래키를 이용해서 참조하는 테이블의 데이터 찾는 것을 정참조라고 하고 현재 테이블을 참조하고 있는 데이터를 찾는 것을 역참조라고 한다. 모델을 만들 때 외래키 필드에서 related_name 옵션을 이용해서 역참조를 할 때 사용할 이름을 지정할 수 있다. related_name의 default는 tablename_set의 형태이다.
serializer는 django의 object, queryset 인스턴스 등 복잡한 테이터들을 json같은 다른 콘텐츠 유형으로 쉽게 변환 할 수 있게 해준다. Meta class의 model에 사용할 테이블을, fields에 사용할 필드들을 적어준다. 역참조 역시 fields에 적어서 사용 가능하다.
from rest_framework import serializers
class MySerializer(serializers.ModelSerializer):
class Meta:
# serializer에 사용될 model, field지정
model = 모델명
# 모든 필드를 사용하고 싶을 경우 fields = "__all__"로 사용
fields = ["모델의 필드1", "필드2", "필드3"]
from rest_framework.response import Response
from rest_framework import status
from serializers 경로 import MySerializer
def get(self, request):
user = request.user
# serializer에 queryset을 인자로 줄 경우 many=True 옵션을 사용해야 한다.
serialized_data = UserSerializer(user).data
return Response(serialized_data, status=status.HTTP_200_OK)
from dataclasses import field
from rest_framework import serializers
from user.models import User, UserProfile
from blog.models import Article, Comment
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = Comment
fields = "__all__"
class ArticleSerializer(serializers.ModelSerializer):
comment_set = CommentSerializer(many=True)
class Meta:
model = Article
fields = "__all__"
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = "__all__"
class UserSerializer(serializers.ModelSerializer):
userprofile = UserProfileSerializer()
article_set = ArticleSerializer(many=True)
class Meta:
# serializer에 사용될 model, field지정
model = User
# 모든 필드를 사용하고 싶을 경우 fields = "__all__"로 사용
fields = ["username", "userprofile", "article_set"]
또한 원하는 필드를 생성해서 추가해줄 수도 있다. serializers.SerializerMethodField()를 사용해서 필드를 선언하고 선언한 필드명 앞에 get_을 붙여 함수를 만들어서 데이터를 반환한다.
class Serializer 클래스 이름(serializers.ModelSerializer):
# serializers.SerializerMethodField()를 사용해 원하는 필드를 생성한다.
새로운 필드명 = serializers.SerializerMethodField()
def get_새로운 필드명(self, obj):
return 원하는 데이터
class Meta:
model = 모델명
fields = ["필드명1", "새로운 필드명"]
APIView를 상속받은 클래스에서 permission을 사용할 때 AllowAny나 IsAuthenticated 같이 이미 설정된 것 외에도 커스텀한 퍼미션을 쓸 수 있다. BasePermmsion을 상속받은 클래스를 작성하면 원하는대로 접근 권한을 설정할 수 있다. return은 bool 타입으로 해서 True면 권한 있음, False면 권한 없음이다.
from rest_framework.permissions import BasePermission
class 퍼미션 클래스 이름(BasePermission):
message = '접근 권한이 없을 때 출력할 메세지'
def has_permission(self, request, view):
'''
permission 조건 만들기
접근 권한이 있으면 return True,
없으면 return False
'''