# 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)
이미지 파일 설정