Django에서는 주로 다루는 데이터의 종류가 달라지는 시점에서 앱을 분리합니다. 인스타그램의 게시물은 이용자 데이터와는 그 성질이 달라 데이터베이스에서 테이블을 따로 관리합니다. 따라서, 주로 다루는 테이블이 달라지므로 앱을 분리하는 것이 좋습니다.
python manage.py startapp posting
settings.py
의 INSTALLED_APPS
에 posting
앱 추가작성자
, 이미지
, 내용
이 필요하고 추가적으로 생성시간
과 업데이트시간
도 추가해주었다 content
: 게시물 내용이고, 인스타그램 게시물등록에서 이미지만 필수고null=True
값을 주었다updated_at
- auto_now=True
: model이 갱신될 때마다. 최종수정일자created_at
- auto_now_add=True
: model이 처음 저장되었을 때 적용User
와 Post
는 1 : N
관계이다.그래서User
클래스와 FK로 연결해주었다 posting
앱의 Post
클래스가 users
앱의 User
클래스를 참조하게 하기 위해 ForeignKey
필드에 users.User
를 인자로 받았다User
클래스를 사용하기 위해서는 import User
로 import 해준다on_delete=models.CASCADE
: 삭제될 시 삭제related_name='posts'
: 역참조를 하는 방법Post
와 Image
는 1 : N
관계이다. 그래서 Image
클래스를 따로 만들고 Post
클래스와 FK로 연결해주었다 users
앱에 utils.py
를 만들어 작성했다(로그인 데코레이터는 사용자 정보와 관련이 있으므로)login_decorator(func)
함수는 데코레이터가 끝나고 나서 수행될 메인함수를 매개변수로 받는다wrapper()
함수의 인자는 인스턴스 자신 self
, http 요청인 request
, 확장성을 고려한 *args, **kwargs
access_token
은 HTTP request의 header에 담긴 Authorization
값을 가져온다. get 메소드로 받아오기 때문에 해당값이 없으면 None을 반환한다payload
: 페이로드는 토큰을 디코딩하면 나오는 사용자에 대한 정보이다. 동일한 사용자라면 동일한 payload
가 반환된다. 디코딩 개념은 여기서payload['id']
인 값을 user
라는 변수에 저장.가변객체
이기 떄문에 다른 객체나 변수 할당이 가능하다jwt.exceptions.DecodeError
: 토큰이 손상되었거나 전달된 토큰 값이 없을 때 발생. decode시에 사용하는 시크릿키나 알고리즘이 다르다면 decode가 불가능하기 떄문에 이런 상황에 발생하는 에러User.DoesNotExist
: 토큰에서 디코드된 사용자 정보가 데이터베이스에 존재하지 않을 때 발생data
에는 request.body에 담긴 값을 json형태로 저장한다user
에는 User request.user 값이 할당되어 있는데 이 값은content
에는 http 요청으로 받아온 데이터의 content를 담는다image_list
에는 마찬가지로 데이터의 image를 담는데 split(',')
메소드를 통해 ,
써서 일렬로 나열한다Post
클래스를 통해 인스턴스를 생성할 것이고 컬럼은 models.py에서 작성했던 content
와 user
두 가지이다. Image
인스턴스도 생성할건데 이미지는 한 게시물에 여러 개의 이미지가 있으므로 for문을 통해 생성해준다전체 게시물 조회
부터 해보자리스트 컴프리헨션
을 통해 모든 게시물의 정보를 리스트에 담는다Post.objects.all()
을 통해 Post의 모든 정보를 QuerySet으로 반환하고 for문을 통해 객체를 하나씩 post에 할당하여 post_list
에 딕셔너리 형태의 요소로 담긴 리스트를 만든다.username
에는 User객체에서 id값이 post.user.id
의 name
이 값을 할당한다content
에는 위에서 생선한 post 인스턴스의 content
를 할당images
는 한 게시물에 여러 개의 이미지가 있는 것이기 때문에 이것도 리스트 컴프리헨션으로 모든 이미지를 불러와서 그 이미지의 url을 리스트에 담아준다created_at
은 post 인스턴스의 created_at
를 담는다post_list
를 반환한다
정말 설명을 너무 잘해주시고 쫀쫀하다 못해 맛깔난 코드였습니다.