[WatchaPedia Clone] Day 2. 모델링 리뷰, 모델
AQuery 모델링 리뷰
열정반 과욕반으로 왓챠피디아에 있는 모든 요소를 모델링하겠다는 의지로 20~30개의 테이블에 대해 모델링을 하고나서, 멘토 리뷰에서 얼마나 수정할 사항이 많을지, 다 뒤엎어야하는건 아닌지 긴장된 상태로 리뷰를 받았지만, 다행히 큰 틀에서 뒤엎는 수준은 아니고 네이밍에 관한 컨벤션, 일부 테이블 통합 등 감당할 범위 내에서 피드백을 받았다.
간략히 피드백에서 수정해야할 사항으로 지적받은 부분은
- 유저 간
follows
,blocks
테이블을 통합해서 관계를 갖는user
를 셀프 참조 받고, 이후에 어떤 관계(팔로우, 차단)를 갖는지를 별도의 컬럼에 표시 - 길지 않은 텍스트(user_bio)는 TextField보다 CharField를 활용
users
테이블의language
,country
를 외부 테이블과 연결하여 정규화- 테이블명과 첫 번째 속성값명이 동일한 경우가 많은데, 이 부분이 추후 테이블 활용과정에서 혼동될 수 있으므로 name 등으로 수정할 필요가 있음
(`countries'-'country', 'genres'-'genre' 등) create_date
보다created_at
이라는 용어를 더 자주 활용book_overviews
에sub_category
에 대해서도 정규화가 필요1
과 유사하게wish
,watching
,not_interested
리스트를 통합- 자주 업데이트 되는 데이터라면
updated_at
항목을 활용
(어제와 똑같은 것 같지만 많은 부분에서 고민하고 수정했다.)
위 피드백 받은 부분에 대해 AQuery 모델링에 반영 후 models.py
작성을 시작했다.
models.py 작성
models.py는 일단 App을 나누는 부분까지는 생각하지 않고 모델링한 전체 내용에 대해 작성하였는데 가장 큰 부분인 users
와 content
를 중심으로 각각 맡아서 작성하였다.
내가 맡은 부분은 users
와 관련된 테이블 작성을 맡았는데, 가장 어려웠던 부분은 ManyToManyField
를 사용하는 방법과 관련하여 through
, related_name
등을 활용하는 부분이 조금 혼란스러웠고, 추후 참조-역참조 등으로 API에서 손쉽게 데이터에 접근하기 위해 어떤 방식으로 만들어야하는지도 조금 더 고민해서 짜면서 시간을 가장 많이 소요하였다. 이 과정에서 소헌 멘토님 블로그를 포함해서 여러 블로그를 참고하며 공부했는데, 관련 내용은 추후 다른 글에 포스팅하고 여기에서는 공부하면서 참고했던 블로그만 남긴다.
https://himanmengit.github.io/django/2018/02/06/DjangoModels-08-ManyToMany-Self-Symmetrical-Intermediate.html
https://velog.io/@hj8853/Django-ManyToMany-relatedname
https://show-me-the-money.tistory.com/entry/Django%EC%97%90%EC%84%9C-Many-To-Many-%ED%95%84%EB%93%9C-%EB%8B%A4%EB%A3%A8%EA%B8%B0
https://whatisthenext.tistory.com/118
결과적으로 고민했던 유저 간 관계 부분은 아래와 같이 구현했다.
class User(models.Model):
email = models.CharField(max_length=45)
password = modles.CharField(max_length=250)
profile_image = models.CharField(max_length=1000, null=True)
user_bio = models.TextField(max_length=300, null=True)
language = models.ForeignKey(Language, on_delete=models.SET_DEFAULT, default='ko-kr')
country = models.ForeignKey(Country, on_delete=models.SET_DEFAULT, default='KO')
disclosure_scope = models.ForeignKey(Disclosure, on_delete=models.SET_DEFAULT, default='Open')
background_image = models.CharField(max_length=1000, null=True)
username = models.CharField(max_length=20)
relations = models.ManyToManyField('self', through='Relation', symmetrical=False)
class Meta:
db_table = 'users'
class Relation(models.Model):
from_user = models.ForeignKey(User, on_delete = models.CASCADE, related_name='relations_by_from_user')
to_user = models.ForeignKey(User, on_delete = models.CASCADE, related_name='relations_by_to_user')
relation_status = models.ForeignKey(RelationStatus, on_delete = models.CASCADE)
class Meta:
db_table = 'relations'
이 부분도 맞는지 여부는 내일 피드백을 받아보고 수정할 사항에 대해 수정해야할 것 같다.
Author And Source
이 문제에 관하여([WatchaPedia Clone] Day 2. 모델링 리뷰, 모델), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@leejaylight/WatchaPedia-Clone-Day-2.-모델링-리뷰-모델저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)