- 기본 세팅은 이전에 다 했기 때문에 views.py만 수정하면 될 것 같다
<시작 상태>
- models.py
# posts/models.py
from django.db import models
from django.urls import reverse
from users.models import User, MaxValueValidator, MinValueValidator
class Category(models.Model):
name = models.CharField("카테고리명", max_length=20)
def __str__(self):
return str(self.name)
class Post(models.Model):
category = models.ForeignKey(Category, verbose_name="카테고리", on_delete=models.DO_NOTHING, related_name="category_posts")
title = models.CharField("제목", max_length=100)
content = models.TextField("내용")
image = models.ImageField("사진", blank=True, null=True, upload_to='%Y/%m/%d')
star = models.IntegerField("별점", validators=[MinValueValidator(1), MaxValueValidator(5)])
created_at = models.DateTimeField("생성시간", auto_now_add=True)
updated_at = models.DateTimeField("마지막 수정시간", auto_now=True)
like = models.ManyToManyField(User, verbose_name="좋아요", related_name="like_posts")
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="posts")
def __str__(self):
return str(self.title)
- urls.py
# posts/urls.py
from django.urls import path
from posts import views
urlpatterns = [
...
path('<str:category_name>/followings/', views.CategoryFollowView.as_view(),
name='category_follow_view'),
...
]
- 이전 글에서 미리 url을 만들어 두었다
- serializers.py
# posts/serializers.py
from rest_framework import serializers
from posts.models import Post
class PostListSerializer(serializers.ModelSerializer):
category = serializers.SerializerMethodField()
user = serializers.SerializerMethodField()
like = serializers.StringRelatedField(many=True)
def get_category(self, obj):
return obj.category.name
def get_user(self, obj):
return obj.user.username
class Meta:
model = Post
fields = ("category", "user", "title", "content",
"image", "star", "like", "updated_at",)
- 카테고리별 글목록 조회할 때 썼던 PostListSerializer를 그대로 사용하면 될 것 같다
<구현하기>
- views.py
# posts/views.py
from django.db.models.query_utils import Q
from rest_framework import status, permissions
from rest_framework.views import APIView
from rest_framework.response import Response
from posts.models import Post
from posts.serializers import PostListSerializer
class CategoryFollowView(APIView):
permission_classes = [permissions.IsAuthenticated]
def get(self, request, category_name):
"""카테고리별 팔로잉 게시글 목록 조회"""
q = Q()
for user in request.user.followings.all():
q.add(Q(user=user), q.OR)
following_posts = Post.objects.filter(q, category__name=category_name)
serializer = PostListSerializer(following_posts, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
- 장고 심화 강의 들으면서 만들었던 drf_project에서 코드를 가져왔다
- 내가 수정한 부분은 following_posts 부분이다
following_posts = Post.objects.filter(q, category__name=category_name)
- 원래는 filter 매개변수로 q만 있었는데 카테고리별로 글 목록을 보여줘야 하기 때문에 카테고리별 글목록 조회 부분에서 쓴 걸 그대로 가져왔다
- filter의 매개변수끼리는 AND로 엮여 있는 것이 기본값이라 그냥 ,(콤마)로 조건을 이어주면 된다고 한다
- 구현 성공!