drf ๋ฐฑ์๋๊ฐ๋ฐ + ํ๋ก ํธ๊ฐ๋ฐ + ๋ฐฐํฌ
: ์ด๋ฒ ํ๋ก์ ํธ๋ ํํ๋ก์ ํธ๋ก ์์ํฉ๋๋ค.
* ๊ฒ์๋ฌผ 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 ์ ๊ฒ์ํ์ต๋๋ค