-
[Django]SamePlaceStoryApi 개발(exclude, 필드값 가져오기 등)카테고리 없음 2023. 7. 25. 22:35
스토리 id가 주어지면 그 스토리와 같은 장소에 대한 스토리 리스트를 반환하는 api를 개발하여야 한다.
먼저, 필요한 사항들을 확인해보자
- 리턴되어야하는 필드: story_id/rep_pic/title
- input: story_id
1. 주어진 스토리의 place_name가져오기(필드값 가져오기)
먼저, 주어진 스토리 안의 place_name을 알아내기로 하였다.
Story.object.filter(id=story_id).value_list등 요상한 방법을 썼지만
사실 그냥 아래처럼 Story객체에 .찍고 뒤에 원하는 필드이름을 적으면 되는 것이었다.
def list(self, story_id: int): place_name = Story.objects.get(id=story_id).place include_story = Story.objects.filter(place = place_name)
2. 코드 간결하게 만들기
지난번 pr에서 코드를 간결하게 만들라는 리뷰를 두번이나 받았더니 이제는 그냥 알아서 돌아가기만 하는 것이 아니라 코드가 간결한가 아닌가도 따져보고 있다.
위와 같은 코드가 아래와 같이 바뀌었다.
def list(self, story_id: int): same_place_story = Story.objects.filter(place = Story.objects.get(id=story_id).place)
3. 결과에서 원래 스토리는 제외하기(exclude 사용)
위 사진과 같이 내가 요청한 id:4인 스토리도 결과에 포함되는 것을 볼 수 있다.
이걸 고치기 위해서!
same_place_story = Story.objects.filter(place = Story.objects.get(id=story_id).place).exclude(id=story_id)
위 처럼 exclude를 사용하였다!
exclude()란?
: 필터링된 결과에서 특정 조건을 만족하는 객체를 제외하는데 사용된다!
제거 완료!
4.rep_pic이 url의 형태를 띄도록 변경
위 사진과 같이 rep_pic의 경로가 절대경로?인 것 같다
https://의 형태가 되어야 한다.
for story in same_place_story: story.rep_pic = story.rep_pic.url
이렇게 코드를 추가해주었다.
for문을 최대한 쓰고 싶지 않았지만 다른 방법을 모르겠다...
+)그 과정에서 update()라는 함수에 대해 알게 되었다(사용은 안함)
: update()는 Django의 QuerySet 메서드 중 하나로, 데이터베이스에서 쿼리를 실행하여 여러 레코드를 한 번에 업데이트하는 기능을 제공합니다. 이 메서드를 사용하면 for 루프를 사용하지 않고도 여러 개의 레코드를 효율적으로 업데이트할 수 있습니다.
update() 메서드를 사용하려면 QuerySet 객체를 생성한 후에 해당 메서드를 호출하면 됩니다. filter() 메서드와 함께 사용하여 특정 조건에 맞는 레코드를 선택하고, 이후에 값을 변경하고자 하는 필드를 지정합니다.