๐Ÿ“’ [ TIL ] 2022.07.13_60์ผ์ฐจ # ์ตœ์ข… ํ”„๋กœ์ ํŠธ (2)

๋ฌธ๋ช…์ฃผยท2022๋…„ 7์›” 14์ผ
0
post-thumbnail

[ 2022-07-13 (์ˆ˜) ์˜ค๋Š˜์˜ TIL ]

[ Today Project ]

drf ๋ฐฑ์—”๋“œ๊ฐœ๋ฐœ + ํ”„๋ก ํŠธ๊ฐœ๋ฐœ + ๋ฐฐํฌ
: ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ํŒ€ํ”„๋กœ์ ํŠธ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

[ Today Learn ]

  • ๊ฒŒ์‹œ๋ฌผ CRUD
  • ๋Œ“๊ธ€ CRUD

โœ๏ธ ๋‚ด๊ฐ€ ๋ฐฐ์šด๊ฒƒ, ์–ป์€๊ฒƒ

* ๊ฒŒ์‹œ๋ฌผ CRUD

models.py

class Article(models.Model):
    article_author = models.ForeignKey('user.User', verbose_name="์ž‘์„ฑ์ž", on_delete=models.CASCADE)
    board = models.ForeignKey('Board', verbose_name="ํ•ด๋‹น ๊ฒŒ์‹œํŒ", on_delete=models.CASCADE)
    article_category = models.ForeignKey('Category', verbose_name="์นดํ…Œ๊ณ ๋ฆฌ ์ข…๋ฅ˜", on_delete=models.CASCADE, null=True)
    article_title = models.CharField('๊ฒŒ์‹œ๋ฌผ ์ œ์˜ฅ', max_length=50)
    article_contents = models.TextField('๊ฒŒ์‹œ๋ฌผ ๋‚ด์šฉ', max_length=500)
    article_image = models.ImageField('์ด๋ฏธ์ง€', upload_to="", blank=True)
    article_post_date = models.DateField('๊ฒŒ์‹œ ์ผ์ž', auto_now_add=True)
    article_exposure_date = models.DateField('๊ฒŒ์‹œ ๋งŒ๋ฃŒ ์ผ์ž', blank=True)
    article_like = models.ManyToManyField(ArticleLike, through='ArticleLikeBridge')
    article_vote = models.ManyToManyField(Vote, through='ArticleVoteBridge')
    
    def __str__(self):
        return f"{self.article_author.username} ๋‹˜์ด {self.board}์— {self.article_category}ํƒœ๊ทธ๋กœ ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค."

serializers.py



class ArticleSerializer(serializers.ModelSerializer):
    comment_set = CommentSerializer(many=True)
    user = serializers.SerializerMethodField()

    def get_user(self,obj):
        return obj.article_author.username

    # custum update
    def update(self, instance, validated_data):
        for key, value in validated_data.items():
            if key == "article_author":
                instance.set_author(value)
                continue

            setattr(instance, key, value)
        instance.save()
        return instance

    class Meta:
        model = ArticleModel
        fields = ['id','article_author','user','article_title','article_image',
        'article_contents','article_post_date',
        'article_exposure_date','comment_set'
        ]

views.py

class ArticleView(APIView):
    permission_classes = [permissions.AllowAny]

    # ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŒ…
    def get(self, request):
        articles = list(ArticleModel.objects.all().order_by("-id"))
        result = ArticleSerializer(articles, many=True).data
        return Response(result) 

    # ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ
    def post(self, request):
        if request.user.is_anonymous:
            return Response({"error":"๊ธ€ ์ž‘์„ฑ์„ ์œ„ํ•ด ๋กœ๊ทธ์ธ์„ ํ•ด์ฃผ์„ธ์š”."})
        else:
            board = BoardModel.objects.get(name=request.data.get('board'))
            category = CategoryModel.objects.get(name=request.data.get('article_category'))
            article = ArticleModel.objects.create(
                article_author = request.user,
                article_title = request.data.get('article_title',''),
                article_contents = request.data.get('article_contents',''),
                article_image = request.FILES,
                article_exposure_date = request.data.get('article_exposure_date',''),
                board = board,
                article_category = category,
            )
            if len(request.data.get('article_title','')) <= 1 :
                return Response({"error":"title์ด 1์ž ์ดํ•˜๋ผ๋ฉด ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."})
            elif len(request.data.get('article_contents','')) <= 10 :
                return Response({"error":"contents๊ฐ€ 10์ž ์ดํ•˜๋ผ๋ฉด ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."}) 
            else:
                article.save()
                return Response({"message":"๊ฒŒ์‹œ๋ฌผ ์ž‘์„ฑ ์™„๋ฃŒ!!"})

    # ๊ฒŒ์‹œ๋ฌผ ์—…๋ฐ์ดํŠธ
    def put(self, request, obj_id):
        article = ArticleModel.objects.get(id=obj_id)

        if request.user == article.article_author or request.user.is_admin:
            article_serializer = ArticleSerializer(article, data=request.data, partial=True, context={"request": request})
            if article_serializer.is_valid():
                article_serializer.save()
                return Response(article_serializer.data, status=status.HTTP_200_OK)
            else:
                return Response(article_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response({"message":"๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •์€ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ์ž๋งŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."})

    # ๊ฒŒ์‹œ๋ฌผ ์‚ญ์ œ
    def delete(self, request, obj_id):
        article = ArticleModel.objects.get(id=obj_id)
        title = article.article_title 
        user = article.article_author
        if request.user == article.article_author or request.user.is_admin:
            ArticleModel.objects.get(id=obj_id).delete()
            return Response({'message': f'{user}๋‹˜์˜ {title} ๊ฒŒ์‹œ๊ธ€์ด ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'})
        else:
            return Response({"message":"๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ๋Š” ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ์ž๋งŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค."})

urls.py

urlpatterns = [
	path('', views.ArticleView.as_view()),
]

* ๋Œ“๊ธ€ CRUD

models.py

class Comment(models.Model):
    comment_author = models.ForeignKey('user.User', verbose_name="์‚ฌ์šฉ์ž", on_delete=models.CASCADE)
    article = models.ForeignKey(Article, verbose_name="๊ฒŒ์‹œ๊ธ€", on_delete=models.CASCADE)
    comment_contents = models.TextField("๋‚ด์šฉ", max_length=100)
    comment_created_at = models.DateTimeField("์ƒ์„ฑ์‹œ๊ฐ„", auto_now_add=True)
    comment_updated_at = models.DateTimeField("์ˆ˜์ •์‹œ๊ฐ„",auto_now = True)
    comment_like = models.ManyToManyField(CommentLike, through='CommentLikeBridge')

    def __str__(self):
       return f"{self.comment_author.username} ๋‹˜์ด ์ž‘์„ฑํ•˜์‹  ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค."

serializers.py

class CommentSerializer(serializers.ModelSerializer):
    comments_related_article = serializers.SerializerMethodField()

    def get_comments_related_article(self,obj):
        return obj.article.id

    # custum update
    def update(self, instance, validated_data):        
        for key, value in validated_data.items():
            if key == "comment_author":
                instance.user(value)
                continue
            setattr(instance, key, value)
        instance.save()
        return instance

    class Meta :
        model = CommentModel
        fields = ['id', 'article', 'comment_author', 'comment_contents', 'comments_related_article']

views.py

class CommentView(APIView):

    def get(self, request, obj_id):
        return Response(CommentSerializer(obj_id).data)

    # ๋Œ“๊ธ€ ์ž‘์„ฑ
    def post(self, request, obj_id):
        if request.user.is_anonymous:
            return Response({"error":"๋Œ“๊ธ€ ์ž‘์„ฑ์„ ์œ„ํ•ด ๋กœ๊ทธ์ธ์„ ํ•ด์ฃผ์„ธ์š”."})
        else:
            user = request.user
            request.data['article'] = ArticleModel.objects.get(id=obj_id)
            contents = request.data.get('comment_contents','')

            comment = CommentModel(
                article = request.data['article'],
                comment_author = user,
                comment_contents = contents,
            )
            comment.save()
            return Response({"message":"๋Œ“๊ธ€ ์ž‘์„ฑ ์™„๋ฃŒ!"})

    # ๋Œ“๊ธ€ ์—…๋ฐ์ดํŠธ
    def put(self, request, obj_id):
        data = request.data
        comment = CommentModel.objects.get(id=obj_id)

        if request.user == comment.comment_author or request.user.is_admin:
            comment_serializer = CommentSerializer(comment, data, partial=True, context={"request": request})
            if comment_serializer.is_valid():
                comment_serializer.save()
                return Response(comment_serializer.data, status=status.HTTP_200_OK)
        else:
            return Response({"error":"๋Œ“๊ธ€ ์ˆ˜์ •์€ ๋Œ“๊ธ€ ์ž‘์„ฑ์ž๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค."})

    # ๋Œ“๊ธ€ ์‚ญ์ œ
    def delete(self, request, obj_id):
        comment = CommentModel.objects.get(id=obj_id)
        comment_author = comment.comment_author
        article_author = comment.article.article_author
        if request.user == comment.comment_author or request.user.is_admin or request.user == article_author:
            CommentModel.objects.get(id=obj_id).delete()
            return Response({'message': f'{comment_author}๋‹˜์˜ ๋Œ“๊ธ€์ด ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.'})
        else:
            return Response({'error': '๋Œ“๊ธ€ ์‚ญ์ œ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค'})

urls.py

urlpatterns = [
	path('<obj_id>/comment/', views.CommentView.as_view()),
]

๐ŸŽ ์ž์„ธํ•œ ์ฝ”๋“œ๋Š” Moonmoo ์— ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค

profile
ํ•˜๋ฃจ ํ•œ๊ฑธ์Œ์”ฉ ๊พธ์ค€ํžˆ ๋‚˜์•„๊ฐ€๋Š” ๊ฐœ๋ฐœ์ž๐Ÿ™†โ€โ™€๏ธ https://github.com/Moonmooj

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด