[Django REST framework] 인스타그램 클론코딩(3) - 게시글 및 부가기능

woownsgud·2022년 9월 15일
# posts - models.py
from django.db import models
from users.models import User

# 해시태그
class Tag(models.Model):
    tag_name = models.CharField(max_length=140, unique=True)
    
    def __str__(self):
        return self.tag_name

# 게시판
class Post(models.Model):
    id = models.AutoField(primary_key=True)
    user_id = models.ForeignKey(User, related_name = 'posts', on_delete=models.CASCADE)
    image = models.ImageField(upload_to='post/', default='default.png')
    textcontent = models.TextField(blank=True)
    hashtag = models.ManyToManyField(Tag, blank=True)
    likes = models.ManyToManyField(User, related_name = 'post_likes', blank=True, through="Like")
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

# 좋아요
class Like(models.Model):
    user_id = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
    post_id = models.ForeignKey(Post, null=True, on_delete=models.CASCADE)
    
# 댓글
class Comment(models.Model):
    user_id = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
    post_id = models.ForeignKey(Post, related_name = 'comments', on_delete=models.CASCADE)
    content = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
# 대댓글(답글)    
class Reply(models.Model):
    user_id = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
    comment_id = models.ForeignKey(Comment, related_name = 'replys', on_delete=models.CASCADE)
    content = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

# posts - serializers.py
from rest_framework import serializers
from .models import Tag, Post, Comment, Reply, Like

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = '__all__'

class LikeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Like
        fields = '__all__'
        
class ReplySerializer(serializers.ModelSerializer): 
    class Meta:
        model = Reply
        fields = ('user_id', 'comment_id', 'content', 'created_at', 'updated_at')

class CommentSerializer(serializers.ModelSerializer):
    replys = ReplySerializer(many=True, read_only=True)
        
    class Meta:
        model = Comment
        fields = ('user_id', 'post_id', 'content', 'created_at', 'updated_at', 'replys')
        
class PostSerializer(serializers.ModelSerializer):
    comments = CommentSerializer(many=True, read_only=True)

    class Meta:
        model = Post
        fields = ('id', 'user_id', 'image', 'textcontent', 'hashtag', 'likes', 'created_at', 'updated_at', 'comments')        
        

# posts - viewsets.py
from rest_framework import viewsets
from rest_framework.decorators import api_view, permission_classes
from rest_framework.generics import get_object_or_404
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from .models import Tag, Post, Comment, Reply, Like
from .serializers import TagSerializer, PostSerializer, CommentSerializer, ReplySerializer, LikeSerializer

class TagViewSet(viewsets.ModelViewSet):
    queryset = Tag.objects.all()
    serializer_class = TagSerializer

class PostViewSet(viewsets.ModelViewSet):
    queryset = Post.objects.prefetch_related('comments')
    serializer_class = PostSerializer
    
class LikeViewSet(viewsets.ModelViewSet):
    queryset = Like.objects.all()
    serializer_class = LikeSerializer

    def create(self, request, *args, **kwargs):
        data = request.data
        Request_user_id = data["user_id"]
        Request_post_id = data["post_id"]
        checkId  = Like.objects.filter(user_id = Request_user_id, post_id = Request_post_id)
        if (len(checkId))==0:
            return super().create(request, *args, **kwargs)
        else:
            Like.objects.get(pk=checkId[0].id).delete()
            Like().save()
            return Response({'status': 'deleted'})
            
class CommentViewSet(viewsets.ModelViewSet):
    queryset = Comment.objects.prefetch_related('replys')
    serializer_class = CommentSerializer
    
class ReplyViewSet(viewsets.ModelViewSet):
    queryset = Reply.objects.all()
    serializer_class = ReplySerializer

# posts - urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from . import views
from .viewsets import TagViewSet, PostViewSet, CommentViewSet, ReplyViewSet, LikeViewSet

router = DefaultRouter()
router.register('post', PostViewSet)
router.register('Tag', TagViewSet)
router.register('Like', LikeViewSet)
router.register('comment', CommentViewSet)
router.register('reply', ReplyViewSet)

urlpatterns = [
    path('', include(router.urls)),

# instaprj - settings.py
STATIC_URL = 'static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# instaprj - urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('users/', include('users.urls')),
    path('', include('posts.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

이미지 파일 설정

0개의 댓글