9주차 5일 TIL

서정인·2022년 6월 20일
0

역참조

외래키를 이용해서 참조하는 테이블의 데이터 찾는 것을 정참조라고 하고 현재 테이블을 참조하고 있는 데이터를 찾는 것을 역참조라고 한다. 모델을 만들 때 외래키 필드에서 related_name 옵션을 이용해서 역참조를 할 때 사용할 이름을 지정할 수 있다. related_name의 default는 tablename_set의 형태이다.

Serializer

serializer는 django의 object, queryset 인스턴스 등 복잡한 테이터들을 json같은 다른 콘텐츠 유형으로 쉽게 변환 할 수 있게 해준다. Meta class의 model에 사용할 테이블을, fields에 사용할 필드들을 적어준다. 역참조 역시 fields에 적어서 사용 가능하다.

serializers.py

from rest_framework import serializers

class MySerializer(serializers.ModelSerializer):
   class Meta:
        # serializer에 사용될 model, field지정
        model = 모델명
        # 모든 필드를 사용하고 싶을 경우 fields = "__all__"로 사용
        fields = ["모델의 필드1", "필드2", "필드3"]

views.py

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)

역참조 사용하는 serialsizer

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", "새로운 필드명"]

custom permission class

APIView를 상속받은 클래스에서 permission을 사용할 때 AllowAny나 IsAuthenticated 같이 이미 설정된 것 외에도 커스텀한 퍼미션을 쓸 수 있다. BasePermmsion을 상속받은 클래스를 작성하면 원하는대로 접근 권한을 설정할 수 있다. return은 bool 타입으로 해서 True면 권한 있음, False면 권한 없음이다.

permissions.py

from rest_framework.permissions import BasePermission

class 퍼미션 클래스 이름(BasePermission):
    message = '접근 권한이 없을 때 출력할 메세지'
    
    def has_permission(self, request, view):
        '''
        permission 조건 만들기
        접근 권한이 있으면 return True,
        없으면 return False
        '''
profile
코딩공부

0개의 댓글