전체 게시글 보기 수정

  • SerializerMethodField 사용 방법

 

https://www.django-rest-framework.org/api-guide/relations/

 

 

(app - serializers.py) 수정/추가 하기

class TodoListSerialize(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()
    like_count = serializers.SerializerMethodField()
    comment_count = serializers.SerializerMethodField()

    def get_user(self, obj):
        return obj.user.email
    
    def get_like_count(self, obj):
        return obj.like.count()
    
    def get_comment_count(self, obj):
        return obj.comment_set.count()
    
    class Meta:
        model = Todos
        fields = ('title', 'user', 'comment_count', 'like_count')

 

 

 

프로필 페이지

  • 시리얼라이즈의 StringRelatedField 필드
  • related_name 혹은 set으로 참조

(app - urls.py)

urlpatterns = [
    path('<int:user_id>/profile/', views.ProfileView.as_view(), name='profile_view'),
]

 

(app - serializers.py)

class UserProfileSerializer(serializers.ModelSerializer):
    # 해당 모델의 __str__() 메서드를 호출하여 문자열로 표현된 관련 객체를 반환
    # PrimaryKeyRelatedField 는 아이디로 보여줌 // read_only=True
    follows = serializers.StringRelatedField(many=True)
    following = serializers.StringRelatedField(many=True)
    #related_name이나 set으로 참조
    todos_set = TodoListSerialize(many=True)
    likey = TodoListSerialize(many=True)

    class Meta:
        model = Users
        fields = ('id', 'email', 'follows', 'following', 'todos_set', 'likey')

 

(app - views.py)

class ProfileView (APIView):
    def get (self, request, user_id):
        user = get_object_or_404(Users, id=user_id)
        serialize = UserProfileSerializer(user)
        return Response(serialize.data)

 

 

 

Feed 페이지

  • Q 객체를 사용해 쿼리를 조작할 수 있다.

(app - urls.py)

urlpatterns = [
    path('feed/', views.FeedView.as_view(), name='feed_view'),
    ]

 

 

(app - views.py)

from django.db.models.query_utils import Q

class FeedView (APIView):
    permission_classes = [IsAuthenticated]

    def get (self, request):
        # Q 객체를 사용하여 쿼리 조건을 생성
        q = Q()
        for user in request.user.follows.all():
            # add 메서드를 사용해 Q 객체를 하나씩 추가
            # 팔로우가 비대칭이므로(한쪽만 팔로우 할 경우) OR를 조건으로 Todos 모델 인스턴스를 가져옴
            q.add(Q(user=user),q.OR)
        feeds = Todos.objects.filter(q)
        serialize = TodoListSerialize(feeds, many =True) 
        return Response(serialize.data)

 

 

 

 

 

 

Q 객체

  • 주로 filter( )와 함께 사용한다.
  • 복잡한 쿼리를 처리할 때 Q 객체를 사용한다.
  • Q 객체는 and( & ), or ( | ), xor ( ^ ) 등의 비교연산자와 함께 쓰인다.
  • 장고 ORM 에서 쿼리문처럼 사용한다.

         *장고 ORM 이란? 객체와 DB 데이터를 매핑(Mapping) 하는 역할. 즉,  SQL 쿼리를 작성하지 않고 장고에서 자동으로 SQL문을 생성하는 것을 말한다. 장점으로는 SQL문 문법이 통일성을 갖게 된다는 점이 있다.

from django.db.models import Q

Q(question__startswith="Who") | ~Q(pub_date__year=2005

https://docs.djangoproject.com/en/4.2/ref/models/querysets/#django.db.models.Q

 

 

 

 

 

F 객체

  • 모델의 필드 또는 어노테이트 될 열의 값(F 객체를 사용해 계산한 결과 값)을 나타낸다.
  • 연산을 할 때 사용한다.
  • 연산에 해당하는 쿼리를 생성한다.
  • 데이터베이스에서 연산을 처리한다.

※ 모델을 저장한 후에도 save( )를 실행할 때 마다 적용된다.

from django.db.models import F

reporter = Reporters.objects.get(name="Tintin")
reporter.stories_filed = F("stories_filed") + 1
reporter.save()

https://docs.djangoproject.com/en/4.2/ref/models/expressions/#django.db.models.F

'Python > Django' 카테고리의 다른 글

[DRF] 14.5 테스트 코드 종류  (0) 2023.04.27
[DRF] 14. 테스트 코드란?  (0) 2023.04.27
[DRF] 12. 좋아요, 팔로우  (1) 2023.04.26
[DRF] 11. 댓글 API(두 개의 모델 참조)  (0) 2023.04.26
[DRF] 10. 게시글 API  (0) 2023.04.26

+ Recent posts