본문 바로가기

SERVER/Django

[Django] 인스타그램 클론 코딩 모델 설계

1. 모델 설계

1) User: Django에서 지원하는 AbstractBaseUser를 상속 

  • AbstractBaseUser: password, last_login, is_active 필드 제공. django가 제공해주는 필드를 이용하면서 사용자 정의 field 추가를 위해 사용. (AbstractUser보다 제공 필드가 적어 더 유연성이 있다)
  • login id로 username이 아닌 nickname 사용. (USERNAME_FIELD='nickname'으로 변경. 애초에 username을 nickname 처럼 받아써도 되겠으나 헷갈리지않도록 구분했다.)
  • 공식문서: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#a-full-example 
  • is_active, is_admin 필드는 django user 모델의 필수 필드.

- nickname: 처음 계정 생성 시 쓰는 userid(중복 불가값으로 unique)

- username: user의 이름

- is_professional: professional 계정인지 확인. default 값 False.

- is_private: 비공개 계정인지 확인. default 값 False. 

- phone_num: 핸드폰 번호

- email: 이메일

- password: 비밀번호

 

권한 설정

- is_active: 활성 계정인지 확인. default 값 True.

- is_staff: admin 접근 가능 계정인지 확인. default 값 False.

- is_superuser: superuser인지 확인. default 값 False.

- is_admin: admin인지 확인. default 값 False. 

 

2) Profile: User 모델과 1:1로 연결해 사용자 세부 정보를 저장

- id: PK

- user_id: FK(User)

- image: 프로필 이미지

- info: 소개글

- website: 웹사이트

- profile_name: 프로필 설정 이름

- gender: 성

- birth_date: 생일

 

3) Post: User 모델과 1:N의 관계.

- id: PK

- content: 내용

- created_time: 작성 시간

- updated_time: 수정 시간

- comment_available: 댓글 작성 가능한지. default 값 True.

- author_id: FK(User)

- location: 위치 

 

4) Comment: User, Post와 1:N의 관계

- id: PK

- author_id: FK. 댓글 작성자 (erd에 author 잘못들어감)

- post_id: FK(Post)

- created_time: 작성 시간

- updated_time: 수정 시간

 

5) File: Post 모델과 1:N의 관계

- id: PK

- file: image/vedio

- post_id: FK(Post)

 

6) Like: User, Post와 1:N의 관계

- id: PK

- post_id: FK(Post)

- user_id: FK(User)

 

7) Follow: Follower:Follwing = N:M의 관계

- id: PK

- follower: FK

- following: FK

 

2. ORM 테스트

 

1) Post 객체 조회, Follow 객체 조회

- related_name 이용해서 likes(해당 user의 Like) , post_likes(해당 post에 대한 Like) 조회

- related_name 이용해서 user의 follwers(user를 follow하는 관계), followings(user가 follow하는 관계) 조회

2) Filter 사용

※ get()과 filter()의 차이

- get()은 쿼리에 맞는 객체 하나만 반환. 쿼리에 맞는 결과가 없을 시 DoesNotExist 에러가 발생. 여러 객체가 조회되면 MultipleObjectsReturned 에러가 발생. 

 

- 쿼리에 맞는 결과가 없다면

 

- 여러 객체가 조회된다면

 

- filter()는 새로운 쿼리셋 생성 후, 필터 조건에 부합하는 객체들을 넣은 후 리턴. (필터 조건에 부합하는 객체가 없다면 빈 쿼리셋 반환)

 

- 여러 객체 조회 시

 

- 빈 객체 조회 시