TIL(22/12/08)

๊น€๊ทœํ˜„ยท2022๋…„ 12์›” 11์ผ
0

๐Ÿ’ป Today I Learned

drf์—์„œ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ์ˆ˜, ์ถ”์ฒœ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

์กฐํšŒ์ˆ˜์™€ ์ถ”์ฒœํ•˜๊ธฐ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„  ๋ชจ๋ธ์— likes์™€ views ํ•„๋“œ(ManyToManyField)๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

	likes = models.ManyToManyField(User, blank=True, related_name='article_likes')
    views = models.ManyToManyField(User, related_name='article_views')

๊ทธ ๋‹ค์Œ ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ serializer์—์„œ views๋ฅผ SerializerMethodField()๋กœ obj.views.count()๋กœ ์ปค์Šคํ…€ ํ•œ ํ›„ count + 1์„ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ save๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค.

class ArticleDetailSerializer(serializers.ModelSerializer):
    views = serializers.SerializerMethodField()
    
    def views(self, obj):
        return obj.views.count() +1

    class Meta:
        model = Article
        exclude = ('created_at',)

๋‹ค์‹œ views์—์„œ serializer๋ฅผ is_valid()๋กœ ๊ฒ€์ฆ ํ›„ save๋ฅผ ํ–ˆ๋”๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ views์˜ count๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์—†์—ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ like ๋กœ์ง์ฒ˜๋Ÿผ ์•„๋ž˜์™€ ๊ฐ™์ด ์‹œ๋„ํ•˜์—ฌ views ํ…Œ์ด๋ธ”์— request user๊ฐ€ ์—†์„ ๊ฒฝ์šฐ add๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ฑ๊ณตํ–ˆ์œผ๋‚˜ ๋กœ๊ทธ์ธ ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์กฐํšŒํ–ˆ์„ ๋•Œ๋งŒ ์กฐํšŒ ์ˆ˜๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋„๋ก ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ํŒ€์›๋“ค๊ณผ ์ƒ์˜ํ•˜์— ๋น„๋กœ๊ทธ์ธ ์œ ์ €๋„ ์กฐํšŒํ–ˆ์„ ๋•Œ ์กฐํšŒ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฒฐ์ •๋˜์–ด ๋‹ค์‹œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค.

class ArticleDetailView(APIView):
	permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    def get(self, request, article_id):
    	article = get_object_or_404(Article, id=article_id)

		if request.user.is_authenticated:
        	article.views.add(request.user)

		serializer = ArticleDetailSerializer(article)

		return Response(serializer.data, status=status.HTTP_200_OK)

๋จผ์ € ๋ชจ๋ธ๋ถ€ํ„ฐ ManyToManyField ๋Œ€์‹  BigIntegerField๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ serializer์—์„œ viewsํ•„๋“œ๋ฅผ .count๋กœ ์ปค์Šคํ…€ํ•  ํ•„์š”๊ฐ€ ์—†์ด views๋ฅผ ๋ฐ”๋กœ +1๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค.

    like = models.ManyToManyField(User, blank=True, related_name='article_like')
    views = models.BigIntegerField(default=0)

๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์—” serializer๋กœ saveํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ views ํ…Œ์ด๋ธ”์— add๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋Œ€์‹  views.py์˜ ArticleDetailView์—์„œ article์„ ํŠน์ •ํ•œ ํ›„ article์˜ viewsํ•„๋“œ์— +1๋กœ views๊ฐ€ ๋Š˜์–ด๋‚˜๊ฒŒ ํ•˜๊ณ , save๋กœ ์ €์žฅํ•ด๋ณด์•˜๋‹ค.

class ArticleDetailView(APIView):
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    def get(self, request, article_id):
        article = get_object_or_404(Article, id=article_id)
        article.views += 1
        article.save()
        
        serializer = ArticleDetailSerializer(article)
        return Response(serializer.data, status=status.HTTP_200_OK)

์„ฑ๊ณต์ ์œผ๋กœ GET์š”์ฒญ์ด ์˜ฌ ๋•Œ ๋งˆ๋‹ค ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์˜ ์กฐํšŒ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์ถ”์ฒœ ๊ธฐ๋Šฅ์€ ์œ„์—์„œ ์‹œ๋„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ article์˜ Like ํ…Œ์ด๋ธ”์— request.user๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ addํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

profile
์›น๊ฐœ๋ฐœ ํšŒ๊ณ ๋ก

0๊ฐœ์˜ ๋Œ“๊ธ€