์ƒˆ์†Œ์‹

ISSUE/Django

[ISSUE]decorator๋ฅผ ์ด์šฉํ•œ ์ค‘๋ณต์ž‘์—… ์ „์ฒ˜๋ฆฌ

  • -

[22.11.26]

๐Ÿƒ ์ค‘๋ณต๋˜๋ฉฐ ๊ฐ ํ•จ์ˆ˜์˜ ์‚ฌ์ „์— ์ฒ˜๋ฆฌ๋˜๋Š” ์ž‘์—… decorator

๐Ÿ“Œ SiteBulkAPIView - ๋ฒŒํฌ ์ฆ๊ฒจ์ฐพ๊ธฐ, ์‚ญ์ œ

class SiteBulkAPIView(APIView):
    """
    ๋ฒŒํฌ ํ•ญ๋ชฉ ์ฆ๊ฒจ์ฐพ๊ธฐ, ์‚ญ์ œ api
    """

    def get_list(self):

        pk_ids: list = self.request.data.get('pk_ids')
        
        return get_list_or_404(Site, id__in=pk_ids)
    
    def validate_ids(self):

        pk_ids: list = self.request.data.get('pk_ids')

        for id in pk_ids:
            get_object_or_404(Site,id=id)

        return self.get_list()

    def put(self, request):
        """
        Site ๋ฒŒํฌ ์ฆ๊ฒจ์ฐพ๊ธฐ ์ถ”๊ฐ€
        """ 

        sites = self.validate_ids()
        
        try:
            with transaction.atomic():
                '''ํŠธ๋žœ์ ์…˜ ์‹œ์ž‘'''

                for site in sites:
                    site.favorite = self.request.data.get('favorite')
                    site.save()
        except:
            raise Response({'msg':'Updated failed'}, status=status.HTTP_400_BAD_REQUEST)

        return Response({'msg':'Updated successfully'}, status=status.HTTP_200_OK)

    def delete(self, request):
        """
        Site ๋ฒŒํฌ ์‚ญ์ œ
        """        
        sites = self.get_list()

        for site in sites:
            site.delete()
    
        return Response({'msg': 'Deleted successfully'}, status=status.HTTP_200_OK)

 

๐Ÿ“Œ SiteTagsAPIView - ๋ฒŒํฌ ํƒœ๊ทธ

class SiteTagsAPIView(APIView):
    """
    ๋ฒŒํฌ ํ•ญ๋ชฉ ํƒœ๊ทธ api
    """

    def get_list(self):

        pk_ids: list = self.request.data.get('pk_ids')
        
        return get_list_or_404(Site, id__in=pk_ids)
    

    def validate_ids(self):

        pk_ids: list = self.request.data.get('pk_ids')

        for id in pk_ids:
            get_object_or_404(Site,id=id)

        return self.get_list()
    
    def post(self, request, **kwards):
        """
        Site ํƒœ๊ทธ ์ถ”๊ฐ€
        """ 
        sites          = validate_ids()
        tags           = self.request.data.get('tags')

        with transaction.atomic():
            '''ํŠธ๋žœ์ ์…˜ ์‹œ์ž‘'''
            
            created_tags   = [Tag.objects.create(name=tag) for tag in tags]

            [tag.site.add(site.id) for tag in created_tags for site in sites]
        
        return Response({'msg':'Updated successfully'}, status=status.HTTP_200_OK)

 

๐Ÿƒ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ ๋ฌธ์ œ์ 

โœ”๏ธ ๋ฒŒํฌ ์ฆ๊ฒจ์ฐพ๊ธฐ, ์‚ญ์ œ Class๋ฅผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„, ๋ฒŒํฌ ํƒœ๊ทธ Class ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ bulk์ž‘์—…์ด๋‹ค ๋ณด๋‹ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ์ž‘์—…์ด ๋‘ Class์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ์ด ๋๋‹ค.

def get_list(self):

        pk_ids: list = self.request.data.get('pk_ids')

        return get_list_or_404(Site, id__in=pk_ids)

    def validate_ids(self):

        pk_ids: list = self.request.data.get('pk_ids')

        for id in pk_ids:
            get_object_or_404(Site,id=id)

        return self.get_list()

๐Ÿ“Œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

โœ”๏ธ ๋ฐ˜๋ณต๋˜๋Š” ๋ฐ์ดํ„ฐ ์กฐํšŒ์™€ ๊ฒ€์ฆํ•˜๋Š” ์ž‘์—…์„ decorator๋กœ ๋ถ„๋ฆฌ๋ฅผ ์‹œํ‚ค๊ณ  ๊ฐ class์˜ apiํ•จ์ˆ˜์—์„œ๋Š” ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ค„์ด๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•ด๋ณด์ž

๐Ÿ“Œ decorator ์‚ฌ์šฉ

def bulk_decorator(func):

    @wraps(func)
    def exec_func(self, request) -> func:

        pk_ids: list = self.request.data.get('pk_ids')

        sites = validate_ids(pk_ids)

        return func(self, request, sites=sites)

    def get_list(pk_ids: list) -> Site:

        return get_list_or_404(Site, id__in=pk_ids)

    def validate_ids(pk_ids: list) -> Site:

        for id in pk_ids:
            get_object_or_404(Site,id=id)

        return get_list(pk_ids)

    return exec_func

โœ”๏ธ bulk_decoratorํ•จ์ˆ˜

  • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์‹คํ–‰ ํ•จ์ˆ˜ exec_func๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ return์œผ๋กœ exec_func๋ฅผ ๋ฐ˜ํ™˜
  • ๊ฐ Class์—์„œ ์ž‘์„ฑํ•˜๋˜ ์ค‘๋ณต๋˜๋˜ ํ•จ์ˆ˜ get_list์™€ validate_idsํ•จ์ˆ˜๋ฅผ bulk_decorator๋‚ด๋ถ€ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑ
  • exec_func๋‚ด๋ถ€์— pk_ids๋กœ ์ „๋‹ฌ๋ฐ›์€ pk(id) ๋ฐฐ์—ด ๊ฐ’์„ validate_ids()ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ˜ธ์ถœํ•˜์—ฌ sites ๋ณ€์ˆ˜์— ๋‹ด์•„ ์‹คํ–‰ํ•จ์ˆ˜ return ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜์˜ ํ‚ค์›Œ๋“œ ๊ฐ€๋ณ€์ธ์ž ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•ด ์ฃผ๊ฒŒ ๋ณ€๊ฒฝ

โœ”๏ธ @bulk_decorator ์‚ฌ์šฉ

 

 class SiteTagsAPIView(APIView):
     """
     ๋ฒŒํฌ ํ•ญ๋ชฉ ํƒœ๊ทธ api
     """

     **@bulk_decorator**
     def post(self, request, **kwards):
         """
         Site ํƒœ๊ทธ ์ถ”๊ฐ€
         """ 
         sites          = **kwards['sites']**
         tags           = self.request.data.get('tags')

         with transaction.atomic():
             '''ํŠธ๋žœ์ ์…˜ ์‹œ์ž‘'''

             created_tags   = [Tag.objects.get_or_create(name=tag)[0] for tag in tags]

             [tag.site.add(site.id) for tag in created_tags for site in sites]

         return Response({'msg':'Add tag successfully'}, status=status.HTTP_200_OK)
class SiteTagsAPIView(APIView):
    """
    ๋ฒŒํฌ ํ•ญ๋ชฉ ํƒœ๊ทธ api
    """

    @bulk_decorator
    def post(self, request, **kwards):
        """
        Site ํƒœ๊ทธ ์ถ”๊ฐ€
        """ 
        sites          = kwards['sites']
        tags           = self.request.data.get('tags')

        with transaction.atomic():
            '''ํŠธ๋žœ์ ์…˜ ์‹œ์ž‘'''
            
            created_tags   = [Tag.objects.get_or_create(name=tag)[0] for tag in tags]

            [tag.site.add(site.id) for tag in created_tags for site in sites]
        
        return Response({'msg':'Add tag successfully'}, status=status.HTTP_200_OK)
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.