Django

django ViewSet 사용 댓글 작성 및 불러오기

JOOHUUN 2022. 6. 20. 20:25

1. blog / models.py 

class Article(models.Model):
    user = models.ForeignKey('user.User', verbose_name="작성자", on_delete=models.CASCADE)
    title = models.CharField("제목", max_length=50)
    category = models.ManyToManyField(Category, verbose_name="카테고리")
    contents = models.TextField("본문")
    start_date = models.DateTimeField("노출 시작일", auto_now_add=True)
    end_date = models.DateTimeField("노출 종료일", null=True, blank=True)
    
    def __str__(self):
        return f"{self.title} / {self.user.username} / " + str(self.start_date)
    


class Comment(models.Model):
    user = models.ForeignKey('user.User', verbose_name="작성자", on_delete=models.CASCADE)
    article = models.ForeignKey(Article, verbose_name="작성자", on_delete=models.CASCADE)
    contents = models.TextField()
    
    def __str__(self):
        return f"{self.article.title} / {self.contents}"

2. blog / serializers.py

class CommentSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()
    
    def get_user(self, obj):
        return obj.user.username
    
    class Meta:
        model = Comment
        fields = "__all__"
        
        
class ArticleSerializer(serializers.ModelSerializer):
    category = serializers.SerializerMethodField()
    commnets = CommentSerializer(many=True, source="comment_set")    
    def get_category(self, obj):
    return [category.name for category in obj.category.all()]
    
    class Meta:
        model = Article
        fields = "__all__"

3. blog / views.py

class CommentsView(viewsets.ModelViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer
    
    def perform_create(self, serializer):
        serializer.save(user = self.request.user)

4. blog / urls.py 

- Article은 ViewSet을 사용하지 않음

from .views import CommentsView
from rest_framework.routers import DefaultRouter

router = DefaultRouter()
router.register('comment', CommentsView, basename='comment') # (댓글)

urlpatterns = [
    path('article/', views.ArticleView.as_view()), 
    path('', include(router.urls)),    
]

5. 포스트맨으로 실험