열정반 과욕반으로 왓챠피디아에 있는 모든 요소를 모델링하겠다는 의지로 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'
이 부분도 맞는지 여부는 내일 피드백을 받아보고 수정할 사항에 대해 수정해야할 것 같다.