열정반 과욕반으로 왓챠피디아에 있는 모든 요소를 모델링하겠다는 의지로 20~30개의 테이블에 대해 모델링을 하고나서, 멘토 리뷰에서 얼마나 수정할 사항이 많을지, 다 뒤엎어야하는건 아닌지 긴장된 상태로 리뷰를 받았지만, 다행히 큰 틀에서 뒤엎는 수준은 아니고 네이밍에 관한 컨벤션, 일부 테이블 통합 등 감당할 범위 내에서 피드백을 받았다.
간략히 피드백에서 수정해야할 사항으로 지적받은 부분은
follows
, blocks
테이블을 통합해서 관계를 갖는 user
를 셀프 참조 받고, 이후에 어떤 관계(팔로우, 차단)를 갖는지를 별도의 컬럼에 표시users
테이블의 language
, country
를 외부 테이블과 연결하여 정규화create_date
보다 created_at
이라는 용어를 더 자주 활용book_overviews
에 sub_category
에 대해서도 정규화가 필요1
과 유사하게 wish
, watching
, not_interested
리스트를 통합updated_at
항목을 활용
(어제와 똑같은 것 같지만 많은 부분에서 고민하고 수정했다.)
위 피드백 받은 부분에 대해 AQuery 모델링에 반영 후 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'
이 부분도 맞는지 여부는 내일 피드백을 받아보고 수정할 사항에 대해 수정해야할 것 같다.