본문 바로가기
Coding/Python

Django Getting User Feed 정리

by Hide­ 2018. 4. 22.
반응형

범위 : #1-39 Getting the User Feed ~ #1-45 Commenting on an Image


1.

views.py에서 GET/POST/DELETE등의 메소드들을 오버라이드해서 사용할 때 인자의 형태는 다음과 같다.


class Feed(APIView):
def get(self, request, format=None):

두번째 인자인 request가 바로 사용자의 요청에 관한 인자이다.

request.user로 접근하면 접근한 사용자를 알아낼 수 있다.


class Feed(APIView):
def get(self, request, format=None):
user = request.user
following_users = user.following.all()

따라서 위와 같이 작성한다면 following_users에 현재 유저의 following컬럼의 모든 값에 접근할 수 있다.

또한 여기서 


for following_user in following_users:
print(following_user.images.all())
return Response(status=200)

위처럼 작성하면 각 following한 유저들의 모든 images들을 불러올 수 있다.

(.images로 접근이 가능한 이유는 models.py에서 creator의 related_name을 images로 줬기 때문)


2.

models.py에 class Meta를 통해 특정한 옵션을 줄 수 있다.

(Meta 클래스는 모델의 설정을 위해 사용한다)


class Meta:
ordering = ['-created_at']

위처럼 작성했다면 created_at를 기준으로 정렬한 후 값을 준다.


3.

sorted_list = sorted(image_list, key=lambda x: x.created_at, reverse=True)

sorted의 첫번째 인자는 정렬할 리스트, 두번째는 함수. reverse는 True로 주면 반대로 나온다.


4.

models.py에 @property를 통해 함수를 만들 수 있다.


@property
def likes_count(self):
return self.likes.all().count()

이 예제에서는 좋아요 수를 카운팅하는 함수를 만들었다.

그다음 serializers.py에 likes필드 대신 likes_count를 적어주면 된다.

참고로 models.py에 있는 Like 클래스의 필드 중 하나가 Image클래스를 Foreign Key로 지정하고 있기 때문에

self.likes로 접근할 수 있는 것이다. (또한 지정하고 있는 필드의 related_name을 likes로 지정했기 때문)


5.

이전에도 말했지만 장고 1.11버전에서는 urls.py에서 라우팅을 위해 url을 사용했다.

url을 사용해서 라우팅을 하려면 정규표현식을 써야하는데 상당히 귀찮다.

그래서 장고 2.0버전부터는 url대신 path를 사용해서 라우팅을 진행하는데,

url에 비해 상당히 사용법이 간단해졌다.

예를 들어 /이미지 이름/like 이런식으로 접근하도록 하고 싶다면,


urlpatterns = [
path('<int:image_id>/like', views.LikeImage.as_view(), name='like_image'),
]

이런식으로 작성하면 된다. 그러면 다음과 같은 형태로 views.py에서 image_id라는 변수로도 접근이 가능하다.

(형식은 <타입:변수이름> 이다)


class LikeImage(APIView):
def get(self, request, image_id, format=None):

자세한 내용은 https://docs.djangoproject.com/en/2.0/topics/http/urls/ 참고


6.

특정한 값을 찾고 해당하는 값이 존재, 존재하지 않을때 if-else등의 조건문을 넣는것보다 try~except문을 사용하면 상당히 편하다.

예를 들어 아래와 같은 코드가 있다면


class LikeImage(APIView):
def get(self, request, image_id, format=None):
try:
image = models.Image.objects.get(id=image_id)
print(image)

except models.Image.DoesNotExist:
return Response(status=404)
return Response(status=200)

인자로 받은 image_id값을 기준으로 Image가 존재하는지 검사하고 만약 존재하지 않는다면,

models.이름.DoesNotExist 형태로 존재하지 않는지 예외 체크를 할 수 있다.


7.

나중에 클라이언트단에서 API서버를 이용할 때 응답코드를 통해 코드를 분기시키는 경우가 많다.

따라서 정상적인 수행일 때, 값이 없을 때 등 다양한 상황에 따라 그에 맞는 status code를 보내줘야 한다.

위처럼 그냥 return Response를 통해 status code를 보내줘도 되지만 좀 더 한눈에 알기 쉽게 해주면 좋을 것 같다.

다행히도 Rest framework에서 기본적으로 기능을 제공해준다.

먼저 상단에 아래처럼 선언해준다.


from rest_framework import status

그리고 Response를 return해줄 때 다음과 같이 사용한다.


return Response(status=status.HTTP_201_CREATED)

상태코드를 전부 다 외우고 있다면 상관없지만 나같은 경우는 전부다 외우진 못한다.

또한 알고 있더라도 저렇게 적는게 가독성면에서도 훨씬 좋다.


8.

특정 시리얼라이저를 저장하고 싶을때는 .save()를 사용하면 된다.

save에 인자를 줄수도 있다. 예를 들어

serializer.save(creator=user, image=found_image)

이런 형태로 줄 수 있다.


serializer를 정상적으로 저장하려면 기존에 serializers.py에서 정의해놓은

fields와 일치해야 한다.

그 값이 일치하는지 체크하는 함수는 is_valid()이다.

여기서는 id, message, creator총 3개의 필드가 존재하는데 id는 PK이므로 제외하고

creator는 read_only=True속성을 줌으로써 message만 입력받도록 해놨다.

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

Django Taggit으로 해시태그 검색 정리  (0) 2018.04.29
Django delete(), add(), remove(), @property 정리  (0) 2018.04.23
Django Restframework 정리  (0) 2018.04.20
Django Admin 페이지 수정 정리  (0) 2018.04.20
Django Model 정리  (0) 2018.04.19