전체 게시글 보기 수정
- 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 |