django 특강, serializers , permission , orm

김하진·2022년 6월 20일
0

오늘도 아침에 스터디 (알고리즘,cs)를 공부하고, django특강, 그리고 팀원들끼리 타임어택을 진행한 후에
개인적인 복습과, 과제를 진행 하였다.

요즘 늦게까지 작업을 하는 경우가 많은데, 그러다 보니 운동 할 시간이 부족해서 저녁을 간단하게 먹고 30분정도 운동을 하고

샤워를 간단히 한후 작업을 하니 뭔가 집중도 잘되고 정신도 맑고, 기분도 좋다.

serializers

class ArticleSerializers(serializers.ModelSerializer):
    article = serializers.SerializerMethodField()
    def get_article(self, obj):
        time_table= ArticleModel.objects.filter(end_time__gte=timezone.now())
        if  time_table:
            time_table.order_by('-start_time')
            print(time_table)
            return [{"user":article.user.email,"title":article.title,"start_time":article.start_time,"end_time":article.end_time,"desc":article.desc} for article in obj.article_set.all()]
    
    class Meta: 
        model = ArticleModel()
        fields = ["article"]

장고의 꽃이라 불릴만 한 기능이다. obj 를 받아와서 다양하게 이용 할 수 도 있고, MethodField를 통해서 자유롭게 필드를
만들 수 있다. 이제 가장 큰 장점이라고 생각한다. 이걸로 인해서 다른 serialziers 에 상속하고, 상속 받고 해서 한번에 여러개의 데이터도 보내줄 수 있고 활용 방법이 정말 많은 것 같다. 처음엔 이해하기 어려웠지만, 타임어택과 개속된 복습을 통해서 이제는 어느정도 익숙해진 것 같다
또한 print(dir()) 이 매우 유용하다!

permission

class RegistedMoreThanAWeekUser(BasePermission):
    """
    가입일 기준 1주일 이상 지난 사용자만 접근 가능
    """
    message = '가입 후 1주일 이상 지난 사용자만 사용하실 수 있습니다.'
    
    def has_permission(self, request, view):
        return bool(request.user and request.user.join_date < (timezone.now() - timedelta(days=7)))

class GenericAPIException(APIException):
    def __init__(self, status_code, detail=None, code=None):
        self.status_code=status_code
        super().__init__(detail=detail, code=code)

class IsAdminOrIsAuthenticatedReadOnly(BasePermission):
    """
    admin 사용자는 모두 가능, 로그인 사용자는 조회만 가능
    """
    SAFE_METHODS = ('GET', )
    message = '접근 권한이 없습니다.'

    def has_permission(self, request, view):
        user = request.user

        if not user.is_authenticated:
            response ={
                    "detail": "서비스를 이용하기 위해 로그인 해주세요.",
                }
            raise GenericAPIException(status_code=status.HTTP_401_UNAUTHORIZED, detail=response)

        if user.is_authenticated and user.is_admin:
            return True
            
        elif user.is_authenticated and request.method in self.SAFE_METHODS:
            return True
        
        return False

permission 을 부여하는 코드이다. 상단에 따로 permissions.py 를 만들어서 views 에 임포트 해주면 된다.
permission_classes = [IsAdminOrIsAuthenticatedReadOnly]
퍼미션은 커스텀이가능하고, 내가 원하는 기능대로 커스텀이 가능해 활용도가 매우 높아 보인다.

요즘 드는 생각이 한번에 너무 많은것을 알아가려 하는 것 보다, 하나라도 제대로 알고 넘어 가는 것이 중요 한 것 같다.

잘 알지도 못하는데 개속 넘어가다보면, 나중에 복습해야할 양이 엄청나게 늘어난다.

기초부터, 코드가 어떤 원리로 어떻게 실행되는지, 어떻게 데이터를 주고받는지, 등 확실한 개념을 이해하고 넘어가야 겠다.

profile
진킴

0개의 댓글